POJ 2689 数论

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

#include<iostream>
#define N 50001
using 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值