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; }