http://poj.org/problem?id=2689

题意:给出一个大区间[L,U],分别求出该区间内连续的相差最小和相差最大的素数对。

由于L<U<=2147483647,直接筛素数是不行的,数组就开不了。可是能够依据素数筛的原理。我们先筛出sqrt(2147483647)以内的素数,然后拿这些素数去筛[L,U]之间的素数,即两次素数筛。可是L,U还是非常大,但U-L<=1000000,所以进行区间平移,将[L,U]平移为[0,U-L],就能用数组放得下。



#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
using namespace std; const int maxn = 47000;
int prime[maxn];
bool flag[maxn];
bool a[1000010];
LL L,U; void get_prime()
{
memset(flag,true,sizeof(flag));
prime[0] = 0;
flag[0] = flag[1] = false;
for(int i = 2; i < maxn; i++)
{
if(flag[i])
prime[++prime[0]] = i;
for(int j = 1; j <= prime[0]&&prime[j]*i < maxn; j++)
{
flag[prime[j]*i] = false;
if(i%prime[j] == 0)
break;
}
}
}
//用已筛选的素数去筛[L,U]之间的素数,区间平移为[0,U-L];
void solve(LL L, LL u)
{
memset(a,true,sizeof(a));
if(L == 1)//特殊推断L为1的时候,映射为0,但1不是素数,所以a[0]为false。
a[0] = false;
for(int i = 1; i <= prime[0]; i++)
{
if(prime[i]*prime[i] > U)
break;
int l = L/prime[i];
if(L%prime[i]!=0)
l++;
if(l == 1) l = 2; // l=1时,L为素数,不能把L本身筛掉
int u = U/prime[i]; for(int j = l; j <= u; j++)
{
LL t = (long long)j*prime[i];
a[t-L] = false;
}
}
} int main()
{
get_prime();
while(~scanf("%lld %lld",&L,&U))
{
solve(L,U);
int Min = 1000010,Max = -1;
int ans[4];
int x,y;
x = y = -1;
for(int i = 0; i <= U-L; i++)
{
if(a[i] == true)
{
x = y;
y = i; if(x == -1)
continue;
int t = y-x;
if(t < Min)
{
ans[0] = x;
ans[1] = y;
Min = t;
}
if(t > Max)
{
ans[2] = x;
ans[3] = y;
Max = t;
}
}
}
if(x != -1 && y != -1)
{
printf("%lld,%lld are closest, %lld,%lld are most distant.\n",ans[0]+L,ans[1]+L,ans[2]+L,ans[3]+L);
}
else
printf("There are no adjacent primes.\n");
}
return 0;
}

最新文章

  1. React Native 之TabBarIOS
  2. 数据结构《17》---- 自动补齐之《二》----Ternary Search Tree
  3. C++学习笔记3:一些错误
  4. HOG特征(Histogram of Gradient)总结(转载)
  5. 20+个可重复使用的jQuery代码片段
  6. Java凝视Override、Deprecated、SuppressWarnings具体解释
  7. 使用ffmpeg录音
  8. Ubuntu亮度无法调节或调节无法保存的问题
  9. 使用 IIS Manager 对 Windows Azure 网站进行远程管理
  10. 并发研究之CPU缓存一致性协议(MESI)
  11. go basic
  12. python之路--网络通信协议
  13. Python 动态加载并下载&quot;梨视频&quot;短视频
  14. Laravel框架中的event事件操作
  15. CUDA C Programming Guide 在线教程学习笔记 Part 11
  16. Django的orm中get和filter的不同
  17. java之 22天 GUI 图形界面编程(二)
  18. CentOS搭建nginx与nginx-rtmp-module搭建流媒体服务器
  19. 저장소system.runtime.remoting.messaging.callcontext
  20. C语言单元测试

热门文章

  1. JS match方法的返回数据的探究
  2. 全球可信并且唯一免费的HTTPS(SSL)证书颁发机构:StartSSL
  3. Spark SQL概念学习系列之Spark SQL基本原理
  4. 笔记三:JS正则表达式
  5. Maven在dos窗口中的命令
  6. 关于HEXO安装失败的解决方法
  7. 【Codeforces Round #433 (Div. 1) C】Boredom(树状数组)
  8. 【CS Round #48 (Div. 2 only)】Game of Chance
  9. 从零开始使用git第三篇:git撤销操作、分支操作和常见冲突
  10. swift项目第五天:swift中storyBoard Reference搭建主界面