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 ...
随机推荐
- poj2636---Electrical Outlets(插线板)
#include <stdio.h> #include <stdlib.h> int main() { int n,nc,i; scanf("%d",&am ...
- leetcode_question_85 Largest Rectangle in Histogram
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- Android View动画
Animation TypeEvaluator View的animate方法 ValueAnimator ObjectAnimator AnimatorSet 使用xml来创建动画 animation ...
- Java并发编程:Thread类的使用介绍
在学习Thread类之前,先介绍与线程相关知识:线程的几种状态.上下文切换,然后接着介绍Thread类中的方法的具体使用. 以下是本文的目录大纲: 一.线程的状态 二.上下文切换 三.Thread类中 ...
- .Net平台-MVP模式再探(二)
PS: 本文与 上一遍文章 没有什么必然的联系,可以说是对于MVP的一定的加深,或许在理解上比上一篇多有点难度. 正文 一.简单讲讲MVP是什么玩意儿 如果从层次关系来讲,MVP属于P ...
- 测试heightlight
var a = '综合型律师事务所'; if (a == '综合型律师事务所') { initradio('ls_classes', '综合型律师事务所'); } else { initradio(' ...
- Csharp多态的实现(虚方法)
1.什么是抽象类 1.1虚方法是用virtual修饰,在子类中用override进行重写 1.2虚方法是一个方法,放在类里面(可以再下面的代码中看到) 1.3虚方法可以 重写,也可以不重写(这个可以再 ...
- svn版本控制
svn自动生成X.java.mine,X.java.r2333,X.java.r2368文件 这是你和别人的操作形成了冲突: 你和别人都从2333这个版本对X.java进行了修改, 别人先修改之后,先 ...
- [非技术参考]C#重写ToString方法
C# 中的每个类或结构都隐式继承 Object 类. 因此,C# 中的每个对象都会获得 ToString 方法,此方法返回该对象的字符串表示形式. 例如,所有 int 类型的变量都有一个 ToStri ...
- 根据用户的ID查用户的名字
awk -F: '{if($3==0){print $1}}' /etc/passwd