题意:求[a, b]之间差最大/小的相邻素数。

0 < a, b < 2^32, 0 < b - a <= 1e6

首先发现a,b很大,以至于无法求出素数来。

然后就考虑退而求次,求出sqrt(b)以内的素数。

发现可以枚举[a, b]之间的数,还开的下一个vis数组。

然后考虑筛去所有合数。

用sqrt(b)以内的素数筛合数即可。

有两个点要注意:

1,b可能等于2147483647,故for循环里面要写成 i <= b && i > 0

2,注意1不是质数,所以a == 1时vis[0] = 1

 #include <cstring>
#include <cstdio>
typedef long long LL;
const int N = ;
LL INF = ; int a, b, top, p[N];
bool vis[N]; inline void solve() {
memset(vis, , (b - a + ) * sizeof(bool));
for(int i = ; i <= top && p[i] * p[i] <= b; i++) {
int j = (a / p[i]) * p[i];
if(j < a) {
j += p[i];
}
if(j == p[i]) {
j += p[i];
}
for(; j <= b && j > ; j += p[i]) {
vis[j - a] = ;
}
}
if(a == ) {
vis[] = ;
} int last = ;
int c = , d = ;
for(int i = a; i <= b && i > ; i++) {
if(vis[i - a]) {
continue;
}
if(!d) {
d = i;
}
else if(!c) {
c = d;
d = i;
last = d;
}
else {
if(i - last < d - c) {
c = last;
d = i;
}
last = i;
}
}
if(!c) {
puts("There are no adjacent primes.");
return;
}
printf("%d,%d are closest, ", c, d);
last = c = d = ;
for(int i = a; i <= b && i > ; i++) {
if(vis[i - a]) {
continue;
}
if(!d) {
d = i;
}
else if(!c) {
c = d;
d = i;
last = d;
}
else {
if(i - last > d - c) {
c = last;
d = i;
}
last = i;
}
}
printf("%d,%d are most distant.\n", c, d);
return;
} inline void getp() {
for(int i = ; 1ll * i * i <= INF; i++) {
if(!vis[i]) {
p[++top] = i;
}
for(int j = ; j <= top && 1ll * i * p[j] * i * p[j] <= INF; j++) {
vis[i * p[j]] = ;
if(i % p[j] == ) {
break;
}
}
}
return;
} int main() {
getp();
while(scanf("%d%d", &a, &b) != EOF) {
solve();
} return ;
}

AC代码

poj2689 Prime Distance的更多相关文章

  1. POJ2689 Prime Distance(数论:素数筛选模板)

    题目链接:传送门 题目: Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Des ...

  2. POJ-2689 Prime Distance (两重筛素数,区间平移)

    Prime Distance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13961   Accepted: 3725 D ...

  3. 解题报告:poj2689 Prime Distance

    2017-10-03 11:29:20 writer:pprp 来源:kuangbin模板 从已经筛选好的素数中筛选出规定区间的素数 /* *prime DIstance *给出一个区间[L,U],找 ...

  4. POJ-2689 Prime Distance,区间素数筛法

                                                    Prime Distance 只会埃氏筛法的弱鸡今天读了读挑战程序设计120页,明白了求小区间内素数的方 ...

  5. POJ2689:Prime Distance(大数区间素数筛)

    The branch of mathematics called number theory is about properties of numbers. One of the areas that ...

  6. POJ2689 - Prime Distance(素数筛选)

    题目大意 给定两个数L和U,要求你求出在区间[L, U] 内所有素数中,相邻两个素数差值最小的两个素数C1和C2以及相邻两个素数差值最大的两个素数D1和D2,并且L-U<1,000,000 题解 ...

  7. poj2689 Prime Distance题解报告

    题目戳这里 [题目大意] 给定一个区间[L,R],求区间内的质数相邻两个距离最大和最小的. [思路分析] 其实很简单呀,很明显可以看出来是数论题,有关于质数的知识. 要注意一下的就是L和R的数据范围都 ...

  8. POJ2689 Prime Distance 质数筛选

    题目大意 求区间[L, R]中距离最大和最小的两对相邻质数.R<2^31, R-L<1e6. 总体思路 本题数据很大.求sqrt(R)的所有质数,用这些质数乘以j, j+1, j+2... ...

  9. poj2689 Prime Distance(素数区间筛法)

    题目链接:http://poj.org/problem?id=2689 题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L&l ...

随机推荐

  1. 在linux上安装spark详细步骤

    在linux上安装spark ,前提要部署了hadoop,并且安装了scala. 提君博客原创 对应版本 >>提君博客原创  http://www.cnblogs.com/tijun/   ...

  2. __new__和__init__的区别

    __new__是一个静态方法,而__init__是一个实例方法. __new__方法会返回一个创建的实例,而__init__什么都不返回. 只有在__new__返回一个cls的实例时后面的__init ...

  3. springboot 如何操作redis

    1.首先应该引入 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  4. springCloud com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

    1.com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: c ...

  5. 布局管理器之BorderLayout(边界布局)

    边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次对应为:上北(NORTH).下南(SOUTH).左西(WEST).右东(EAST),中(CENT ...

  6. spring boot和swagger 整合

    本文来源:https://blog.csdn.net/saytime/article/details/74937664 一.依赖 <dependency> <groupId>i ...

  7. Lodop打印如何隐藏table某一列

    Lodop打印超文本,既可以打印页面上存在的某些部分,也可以自己组织超文本和css样式传入,有些需要打印的页面表格里,会有一列有编辑删除等按钮,用于对于数据库数据的操作,在打印的时候,这一列由于不属于 ...

  8. endnote格式

    endnote插入参考文献后的对齐方式和缩进空格 听语音 | 浏览:4780 | 更新:2016-11-28 20:46 1 2 3 4 5 6 7 分步阅读 1.endnote 导入到word参考文 ...

  9. ES6函数增强

    函数参数可以拥有默认值.调用函数时,如果没有进行相应的实参传递,参数就会使用默认值.怎么给参数提供默认值呢?很简单,声明函数时候,给形参赋一个值就可以了,这个值就是参数的默认值. // num2拥有默 ...

  10. 【C/C++】实现数据结构广义表

    1. 广义表的定义     每个元素可以为Atom,原子,也可以为线性表.      线性表的推广.线性表元素有唯一的前驱和后继,为线性表,而广义表是多层次的线性表      表头:第一个元素,可能是 ...