POJ 2689 Prime Distance(素数筛选)
题目链接:http://poj.org/problem?id=2689
题意:给出一个区间[L, R],找出区间内相连的,距离最近和距离最远的两个素数对。其中(1<=L<R<=2,147,483,647) R - L <= 1000000
思路:数据量太大不能直接筛选,要采用两次素数筛选来解决。我们先筛选出2 - 50000内的所有素数,对于上述范围内的数,如果为合数,则必定有2 - 50000内的质因子。换一句话说,也就是如果一个数没有2 - 50000内的质因子,那么这个数为素数。假设我们先预处理出2 - 50000内的所有素数,只需要从头到尾筛选一遍即可。
code:
#include <cstdio>
#include <cstring>
typedef long long LL;
const int MAXN = ;
const int MAXM = ;
int primeA[MAXN]; // primeA[0]存放2-MAXN的素数个数 primeA[i]的值为第i个值
int primeB[MAXM]; // primeB[0]存放L-R的素数个数 primeB[i]的值为区间内第i个素数的值
bool isPrime[MAXM]; // 筛选出MAXN内的所有素数
void GetPrimeA()
{
memset(primeA, , sizeof(primeA));
for (int i = ; i < MAXN; ++i)
{
if (!primeA[i]) primeA[++primeA[]] = i;
for (int j = ; j <= primeA[] && primeA[j] * i < MAXN; ++j)
{
primeA[primeA[j] * i] = ;
if (i % primeA[j] == ) break;
}
}
} // 利用primeA筛选出primeB
void GetPrimeB(int L, int R)
{
memset(isPrime, true, sizeof(isPrime));
if (L < ) L = ; // 从第一个素数开始,一直到primeA[0],筛选出[L, R]内的素数
for (int i = ; i <= primeA[] && (LL)primeA[i] * primeA[i] <= R; ++i)
{
int s = L / primeA[i] + (L % primeA[i] > );
if (s == ) s = ; // 刚好为1,此时要筛选的数为素数
for (int j = s; (LL)j * primeA[i] <= R; ++j)
{
if ((LL)j * primeA[i] >= L)
isPrime[(LL)j * primeA[i] - L] = false; // j * primeA[i]显然不是素数,他有质因子primeA[i]
// 由于数据较大,可以利用相对L的距离来存这个数
}
}
primeB[] = ;
int len = R - L;
for (int i = ; i <= len; ++i)
{
if (isPrime[i])
primeB[++primeB[]] = i + L;
}
} int main()
{
GetPrimeA();
int L, R;
while (scanf("%d %d", &L, &R) == )
{
GetPrimeB(L, R);
if (primeB[] < )
{
printf("There are no adjacent primes.\n");
continue;
}
int x1 = , y1 = , x2 = , y2 = ;
for (int i = ; i < primeB[]; ++i)
{
if (primeB[i + ] - primeB[i] < y1 - x1)
{
x1 = primeB[i];
y1 = primeB[i + ];
}
if (primeB[i + ] - primeB[i] > y2 - x2)
{
x2 = primeB[i];
y2 = primeB[i + ];
}
}
printf("%d,%d are closest, %d,%d are most distant.\n", x1, y1, x2, y2);
}
return ;
}
POJ 2689 Prime Distance(素数筛选)的更多相关文章
- poj 2689 Prime Distance(区间筛选素数)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9944 Accepted: 2677 De ...
- poj 2689 Prime Distance(大区间素数)
题目链接:poj 2689 Prime Distance 题意: 给你一个很大的区间(区间差不超过100w),让你找出这个区间的相邻最大和最小的两对素数 题解: 正向去找这个区间的素数会超时,我们考虑 ...
- poj 2689 Prime Distance (素数二次筛法)
2689 -- Prime Distance 没怎么研究过数论,还是今天才知道有素数二次筛法这样的东西. 题意是,要求求出给定区间内相邻两个素数的最大和最小差. 二次筛法的意思其实就是先将1~sqrt ...
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
题意:给出一个区间[L,U],找出区间里相邻的距离最近的两个素数和距离最远的两个素数. 用素数筛选法.所有小于U的数,如果是合数,必定是某个因子(2到sqrt(U)间的素数)的倍数.由于sqrt(U) ...
- [ACM] POJ 2689 Prime Distance (筛选范围大素数)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12811 Accepted: 3420 D ...
- 数论 - 素数的运用 --- poj 2689 : Prime Distance
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12512 Accepted: 3340 D ...
- ZOJ 1842 Prime Distance(素数筛选法2次使用)
Prime Distance Time Limit: 2 Seconds Memory Limit: 65536 KB The branch of mathematics called nu ...
- POJ - 3126 Prime Path 素数筛选+BFS
Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Security s ...
- POJ 2689 Prime Distance (素数+两次筛选)
题目地址:http://poj.org/problem?id=2689 题意:给你一个不超过1000000的区间L-R,要你求出区间内相邻素数差的最大最小值,输出相邻素数. AC代码: #includ ...
随机推荐
- poj2521---lose money
#include <stdio.h> #include <stdlib.h> int rever(int n) { return -n; } int main() { int ...
- docker基于 aufs 文件系统
docker的核心功能就是容器版本管理,在容器层实现了CVS版本管理,比如git那种可以commit/roll back 而AUFS就是其实现基础 AUFS可以实现文件系统的snapshot,这样对f ...
- centos6 qt ENV
打算做嵌入式图像处理,计划方案嵌入式Linux+OpenCV+QT,昨天简单入门OpenCV今天看看QT,QT就先弄Linux下面的,回家之前争取把基本的摸通,然后能在板子上跑起来 关于QT安装 QT ...
- 汉诺塔VII(递推,模拟)
汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- asp.net DropDownList实现ToolTip功能
在绑定DropDownList控件时,可能出现绑定显示的文本过长以至于超过控件长度的内容看不到,这时候就需要使用ToolTip完成其功能,即鼠标放到相应选项后就可显示其完成内容. 首先,在页面引入jQ ...
- 如何在MFC中操作资源句柄
如何获取动态库中对话框相关资源,避免因资源问题报错? AfxGetResourceHandle用于获取当前资源模块句柄AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄. ...
- IOS7 position:fixed 定位问题
在IOS7下position:fixed定位会出一些bug. 输入框 focus 状态下 fixed会随之改变.参见该页面详细描述(http://www.cnblogs.com/zhangdaipin ...
- JavaScript之面向对象学习八(继承)
简介:继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法. 但是JS的函数并没有签名,所以在ECMASc ...
- Android中adb push和adb install的使用区别
Android中adb push和adb install的使用区别 转载 本篇文章由史迎春(@三俗小女子)投稿.转载请注明原文地址. 在Android实际开发中,经常会使用adb命令,安装应用程序可 ...
- 寻找所有javaee官方文档的方法
所有跟java有关的首先要去oracle官网. 所有文档都放在: Oracle Technology Network 即:著名的OTN网站 链接在首页的最后一个标签: 侧面就是documentions ...