poj2689 Prime Distance
题意:求[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的更多相关文章
- POJ2689 Prime Distance(数论:素数筛选模板)
题目链接:传送门 题目: Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: Accepted: Des ...
- POJ-2689 Prime Distance (两重筛素数,区间平移)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13961 Accepted: 3725 D ...
- 解题报告:poj2689 Prime Distance
2017-10-03 11:29:20 writer:pprp 来源:kuangbin模板 从已经筛选好的素数中筛选出规定区间的素数 /* *prime DIstance *给出一个区间[L,U],找 ...
- POJ-2689 Prime Distance,区间素数筛法
Prime Distance 只会埃氏筛法的弱鸡今天读了读挑战程序设计120页,明白了求小区间内素数的方 ...
- POJ2689:Prime Distance(大数区间素数筛)
The branch of mathematics called number theory is about properties of numbers. One of the areas that ...
- POJ2689 - Prime Distance(素数筛选)
题目大意 给定两个数L和U,要求你求出在区间[L, U] 内所有素数中,相邻两个素数差值最小的两个素数C1和C2以及相邻两个素数差值最大的两个素数D1和D2,并且L-U<1,000,000 题解 ...
- poj2689 Prime Distance题解报告
题目戳这里 [题目大意] 给定一个区间[L,R],求区间内的质数相邻两个距离最大和最小的. [思路分析] 其实很简单呀,很明显可以看出来是数论题,有关于质数的知识. 要注意一下的就是L和R的数据范围都 ...
- POJ2689 Prime Distance 质数筛选
题目大意 求区间[L, R]中距离最大和最小的两对相邻质数.R<2^31, R-L<1e6. 总体思路 本题数据很大.求sqrt(R)的所有质数,用这些质数乘以j, j+1, j+2... ...
- poj2689 Prime Distance(素数区间筛法)
题目链接:http://poj.org/problem?id=2689 题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L&l ...
随机推荐
- 使用withCount后再使用select设置查询的字段。就找不到withCount的数据了
https://laravelacademy.org/index.php/discussion/1021 如:Article::withCount(['comments'])->select(' ...
- 爬虫实战——Scrapy爬取伯乐在线所有文章
Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...
- DAY01、计算机组成及操作系统
一.编程与编程的目的: 1.什么是语言?什么是编程语言? 语言是一事物与另一事物之间沟通的介质 编程语言就是程序员与计算机之间沟通的介质 2.什么是编程? 程序员把自己想要让计算机做的事用编程语言表达 ...
- HDU 5025 Saving Tang Monk
Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great Classi ...
- Js 中一系列宽度和高度的学习
在学习元素一系列宽度和高度之前,我们先来看一个平时开发中几乎不会遇到的问题,那就是html文档声明<!DOCTYPE html> 确实会对元素的宽高产生影响.几乎不会遇到,是因为我们在写h ...
- codeforces478C
Table Decorations CodeForces - 478C 你有r个红的,g个绿的和b个蓝的气球.要为宴会布置一张桌子,你恰好需要三个气球.附在桌子上的三个气球不应该有相同的颜色.如果我们 ...
- JarvisOJ Basic 熟悉的声音
两种元素,还有声音,想到了莫尔斯电码,解码得到 jbluwewnz 提交,发现不对,觉得应该是有实际意义的东西,实在想不到还能怎么解,就去看了题解. 发现这个还可以再套一个凯撒密码,就拿python写 ...
- 一条命令停止所有lxc容器,删除所有lxc容器
for i in $(virsh -c lxc:/// list | grep -v 'Id' | awk '{print $2}');do virsh -c lxc:/// destroy ${i} ...
- POJ1442-查询第K大-Treap模板题
模板题,以后要学splay,大概看一下treap就好了. #include <cstdio> #include <algorithm> #include <cstring ...
- 洛谷p2661信息传递题解
题目 这个题一眼看上去就是用并查集求最小环. 我们可以设两个数组分别是f,d分别表示该点的爸爸和该点到祖先的距离. 当该点的爸爸等于他时,那他肯定就是祖先. 此时信息就肯定传递完了,此时的整个图中(我 ...