标签:ogr break typedef oss because memset 素数 while fine
Input
Output
Sample Input
2 17 14 17
Sample Output
2,3 are closest, 7,11 are most distant. There are no adjacent primes.
主要思想是偏移数组,区间素数打表。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> typedef long long LL; #include<algorithm> using namespace std; #define N 1000010 int notprime[N]; int prime[N]; int prime2[N]; bool vis[N]; bool val[N]; int pn=0; void getPrime() { memset(prime,0,sizeof(prime)); for(int i=2;i<=N;i++) { if(!prime[i])prime[++prime[0]]=i; for(int j=1;j<=prime[0]&&prime[j]<=N/i;j++) { prime[prime[j]*i]=1; if(i%prime[j]==0)break; } } } void getPrime2(int L,int R) { memset(notprime,false,sizeof(notprime)); if(L<2)L=2; for(int i=1;i<=prime[0]&&(long long)prime[i]*prime[i]<=R;i++) { int s=L/prime[i]+(L%prime[i]>0); if(s==1)s=2; for(int j=s;(long long)j*prime[i]<=R;j++) if((long long)j*prime[i]>=L) notprime[j*prime[i]-L]=true; } prime2[0]=0; for(int i=0;i<=R-L;i++) if(!notprime[i]) prime2[++prime2[0]]=i+L; } int main() { getPrime(); LL m,t,h; int l,r; while(~scanf("%d%d",&l,&r)) { int sh1=0,sh2=1000000,lo1=0,lo2=0; getPrime2(l,r); if(prime2[0]<2) { puts("There are no adjacent primes."); continue; } for(int i=1;i<prime2[0];i++) { if(sh2-sh1>prime2[i+1]-prime2[i]) { sh1=prime2[i]; sh2=prime2[i+1]; } if(lo2-lo1<prime2[i+1]-prime2[i]) { lo1=prime2[i]; lo2=prime2[i+1]; } } printf("%d,%d are closest, %d,%d are most distant.\n",sh1,sh2,lo1,lo2); } }
标签:ogr break typedef oss because memset 素数 while fine
原文地址:http://www.cnblogs.com/ygtzds/p/7881590.html