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 ...
随机推荐
- 一个基于Qt的截屏程序
最近有一个arm板上的程序需要重写用户手册,在网上找了许久,没找到合适的截屏工具.于是只好自己动手做一个了. 因为arm板上有已经有了Qt环境,于是想到用 Qt的QPixmap::grabWindow ...
- csu 1563 Lexicography
题意:给出一堆字母 问这些字母组成的字符串中第k大的 排列组合,具体看代码 //寒假集训被何柱大大踩好惨(>_<) #include<cstdio> #include<i ...
- Windows消息大全
最近在写TabControl的用户控件,需要用到sendMessage,已做备份. 引用:http://bbs.aau.cn/forum.php?mod=viewthread&tid=7776 ...
- WPF基础——继承
1) 可以定义继承自其他类的类,关系是“父类/子类”.子类继承父类的成员(不严谨) 2) 定义语法“class子类:父类”,不指定父类则父类为Object,.Net中所有类都直接或者间接继承自Ob ...
- JavaSE思维导图(三)
- C++中#include <xxx.h>和#include "xxx.h"的区别(尖括号和双引号的区别)
第一种方式:采用< >方式,表示让编译器在编译器的预设标准路径下去搜索相应的头文件,如果找不到则报错. 例如:VS2015的安装目录\Microsoft Visual Studio 14. ...
- 【转】Java保留固定小数位的4种方法
package com.test; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.Numb ...
- iOS keyChain(钥匙串)的简单使用
通常在开发中我们需要长久的保存某些值比如用户的账号密码等,对于隐私度很高的数据来说保证数据的安全性是尤为重要的.ios中的keyChain是一种很好的选择. 首先去开发者网站(https://deve ...
- csapp lab2 bomb 二进制炸弹《深入理解计算机系统》
bomb炸弹实验 首先对bomb这个文件进行反汇编,得到一个1000+的汇编程序,看的头大. phase_1: 0000000000400ef0 <phase_1>: 400ef0: 48 ...
- js处理json的方法
var json = "{id:"myid", url:"http://www.myurl.com"}"; var js= (new Fun ...