标签:des style blog http color os io strong ar
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 12512 | Accepted: 3340 |
Description
Input
Output
Sample Input
2 17 14 17
Sample Output
2,3 are closest, 7,11 are most distant. There are no adjacent primes.
Source
Mean:
输入两个数l和r,要你找出l~r范围内相邻的最近的素数。
analyse:
这题的数据范围很大。
我们首先来分析,int范围内(2147483647)的素数都可以用根号(2147483647)内的素数全部筛出来,那就用埃拉托斯尼斯筛法这个范围内的素数都筛出来。然后再来排除l~r范围内的合数就可。其中有一个小技巧,避免了超时。
Time complexity:O(50000*m),其中m为素数的个数。
Source code:
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---‘\____
.‘ \\| |// `.
/ \\||| : |||// / _||||| -:- |||||- | | \\\ - /// | |
| \_| ‘‘\---/‘‘ | |
\ .-\__ `-` ___/-. /
___`. .‘ /--.--\ `. . __
."" ‘< `.___\_<|>_/___.‘ >‘"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-‘======
`=---=‘
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.............................................
佛祖镇楼 BUG辟易
佛曰:
写字楼里写字间,写字间里程序员;
程序人员写程序,又拿程序换酒钱。
酒醒只在网上坐,酒醉还来网下眠;
酒醉酒醒日复日,网上网下年复年。
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员。
别人笑我忒疯癫,我笑自己命太贱;
不见满街漂亮妹,哪个归得程序员?
*/
//Memory Time
// 1347K 0MS
// by : Snarl_jsb
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<string>
#include<climits>
#include<cmath>
#define N 50005
#define LL long long
using namespace std;
bool v[N*20];
LL p1[N],p2[N];
LL c1,c2,d1,d2;
LL l,r,num,idx,b,t;
void make_p1()
{
num=-1;
for(LL i=2;i<N;++i)
{
if(!v[i])
{
p1[++num]=i;
}
for(LL j=0;j<=num&&i*p1[j]<N;++j)
{
v[i*p1[j]]=1;
if(i%p1[j]==0) break;
}
}
// cout<<num<<endl;
}
void make_p2()
{
idx=-1;
memset(v,0,sizeof(v));
for(LL i=0;i<=num;++i)
{
b=l/p1[i];
while(b*p1[i]<l||b<=1) //一个关键的剪枝,不用会超时
b++;
for(LL j=b*p1[i];j<=r;j+=p1[i])
{
if(j>=l&&j<=r)
{
v[j-l+1]=1;
}
if(j>r) break;
}
}
for(LL i=l;i<=r;++i)
{
if(!v[i-l+1]&&i>1)
{
p2[++idx]=i;
}
}
}
void solve()
{
make_p2();
LL minn=INT_MAX,maxx=INT_MIN;
for(LL i=1;i<=idx;++i)
{
t=p2[i]-p2[i-1];
if(t<minn)
{
minn=t;
c1=p2[i-1];
c2=p2[i];
}
if(t>maxx)
{
maxx=t;
d1=p2[i-1];
d2=p2[i];
}
}
}
int main()
{
// freopen("C:\\Users\\ASUS\\Desktop\\cin.txt","r",stdin);
// freopen("C:\\Users\\ASUS\\Desktop\\cout.txt","w",stdout);
make_p1();
while(~scanf("%I64d %I64d",&l,&r))
{
solve();
if(idx<1) puts("There are no adjacent primes.");
else
{
printf("%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",c1,c2,d1,d2);
}
}
return 0;
}
数论 - 素数的运用 --- poj 2689 : Prime Distance
标签:des style blog http color os io strong ar
原文地址:http://www.cnblogs.com/acmer-jsb/p/3951671.html