POJ-2689 Prime Distance(区间素数筛--经典题)
来源:互联网 发布:男士风衣品牌 知乎 编辑:程序博客网 时间:2024/05/22 05:21
题意:
给出一个区间[L, R],求该区间内的所有素数(1 <= L,R <= 2.1E9, R-L <= 1e6)
思路:
区间素数筛,枚举不超过sqrt(R)的所有质数p,然后再去枚举[L, R]区间内p的倍数,将之划去,最后区间内剩下的就都是素数了。注意一点,1需要特判不是素数。
代码:
#include <algorithm>#include <string.h>#include <cstdio>#define LL long longusing namespace std;const int N = 1e5;const int maxn = 1e6+5;int isprime[maxn], prime[maxn], len;LL L, R;int ans[maxn];void prime_init(){len = 0;memset(isprime, 0, sizeof isprime);for(int i = 2; i <= N; ++i)if(!isprime[i]){prime[++len] = i;if(1ll*i*i > N) continue;for(int j = i*i; j <= N; j+=i)isprime[j] = 1;}}void work(){memset(ans, 0, sizeof ans);for(int i = 1; i <= len; ++i){if(1ll*prime[i]*prime[i] > R) break;LL star = ((L-1)/prime[i]+1)*prime[i];for(LL j = star; j <= R; j+=prime[i])if(j != prime[i]) ans[j-L+1] = 1;}if(L == 1) ans[1] = 1;}int main(){prime_init();while(~scanf("%lld %lld", &L, &R)){work();LL i, mins, maxx, ans1, ans2, ans3, ans4;ans1 = ans2 = -1, i = 0;while(i < R-L+1 && (ans1 == -1 || ans2 == -1)){++i;if(ans[i]) continue;if(ans1 == -1) ans1 = i+L-1;else if(ans2 == -1) ans2 = i+L-1;}if(ans1 == -1 || ans2 == -1) puts("There are no adjacent primes.");else{mins = maxx = ans2-ans1;ans3 = ans1, ans4 = ans2;int pre = ans2;for(++i; i <= R-L+1; ++i){if(ans[i]) continue;if(i+L-1-pre < mins){mins = i+L-1-pre;ans1 = pre, ans2 = i+L-1;}if(i+L-1-pre > maxx){maxx = i+L-1-pre;ans3 = pre, ans4 = i+L-1;}pre = i+L-1;}printf("%lld,%lld are closest, %lld,%lld are most distant.\n", ans1, ans2, ans3, ans4);}}return 0;}
继续加油~
阅读全文
1 0
- POJ-2689 Prime Distance(区间素数筛--经典题)
- Poj 2689 Prime Distance【素数区间筛】
- POJ 2689 Prime Distance(素数区间筛法--经典题)
- POJ 2689 Prime Distance【大区间素数筛选】【埃氏筛法】【经典题】
- POJ 2689-Prime Distance(区间素数)
- POJ 2689 - Prime Distance 任意区间内筛素数
- poj 2689 Prime Distance(大区间筛素数)
- poj 2689 Prime Distance 筛法/二次筛法/区间素数
- poj 2689 Prime Distance 筛法+区间筛素数
- poj 2689 Prime Distance(大数区间素数筛法)
- POJ 2689 Prime Distance(区间素数筛)
- POJ 2689 Prime Distance 【大区间筛素数】
- POJ 2689 Prime Distance(区间相邻素数最大、小距离,区间素数筛)
- Poj 2689 Prime Distance ----大区间素数筛选
- POJ - 2689 Prime Distance(大区间素数筛选)
- [ACM] POJ 2689 Prime Distance (大区间素数筛选)
- POJ题目2689 Prime Distance(任何区间素数筛选)
- poj 2689 Prime Distance 二次筛素数
- 播放wav, PlaySound不太靠谱,有时没有声音,原因未知,改用MCI函数,尚未测试
- 微信-----信息加密与解密流程图的过程
- JAVA中ListIterator和Iterator详解与辨析
- SOAP WebService 短信接口对接
- 【文献阅读】Densely Connected Convolutional Networks-best paper-CVPR-2017
- POJ-2689 Prime Distance(区间素数筛--经典题)
- python常用的十进制、16进制、字符串、字节串之间的转换
- Android ANR的产生与分析
- java常用三种排序算法---(插入,冒泡,顺序)及其时间复杂度
- CarrierConfigManager解析
- css学习笔记之垂直居中
- 活体检测的实现
- NTT(快速数论变换)
- JsonCpp遍历json