POJ 2689 数论

来源:互联网 发布:八爪鱼采集微信数据 编辑:程序博客网 时间:2024/05/10 22:30

刚做素数部分,把以前不懂的题目搞定了。还不错。

#include<iostream>#define N 50001using namespace std;bool f[N],seg[1111111];int prime[N],pcnt;__int64 rec[1111111];void deal( __int64 L,__int64 U ){  memset( seg,true,sizeof(seg) );     for( int i=1;i<=pcnt;i++ )  {    __int64 j=L/prime[i];    while( j*prime[i]<L||j<=1 )     j++;    for( j=j*prime[i];j<=U;j+=prime[i] )       if( j>=L )      seg[j-L]=false; } if( L==1 )  seg[0]=false;}int main(){ memset( f,true,sizeof(f) ); pcnt=0; for( int i=2;i<N;i++ ) if( f[i] ) { prime[++pcnt]=i; for( int j=i+i;j<N;j+=i )  f[j]=false;} __int64 L,U;int recnt; while( scanf("%I64d %I64d",&L,&U)!=EOF ) {    deal(L,U);    recnt=0;    for( int i=0;i<=U-L;i++ )    if( seg[i] )    rec[recnt++]=i;   if( recnt<=1 )   {      printf( "There are no adjacent primes.\n" );      continue;   }    __int64 maxD,minD,maxL,minL;    maxD=0;minD=1111111;   for( int i=1;i<recnt;i++ )    {   if( rec[i]-rec[i-1]>maxD )   { maxD=rec[i]-rec[i-1]; maxL=i; } if( rec[i]-rec[i-1]<minD ) { minD=rec[i]-rec[i-1]; minL=i; }   }   printf( "%I64d,%I64d are closest, %I64d,%I64d are most distant.\n",rec[minL-1]+L,rec[minL]+L,rec[maxL-1]+L,rec[maxL]+L );  } return 0;}


原创粉丝点击