poj 2689 大區間篩素數

                      題意:求區間L,R,之間距離最遠的和最近的相鄰素數。

                      題目鏈接:點擊打開鏈接                   

                     詳細見代碼:

         

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
//const int maxn = 1e5+100;
#define INF 0x3f3f3f3f
const int MOD=1000000000;
#define PI acos(-1.)
#define VV PI*mid*(r*r+r*RR+RR*RR)/3.0
const int maxn=1e6+100;
int prime[maxn];
int pri[maxn];
int A[maxn];

int _[maxn];
int n,m,mm,nn;
void init()
{
	int i,j;
	for(i=1;i<=1000002;i++)
		pri[i]=i;
	m=1;
	for(i=2;i<=1000002;i++)
	{
		if(pri[i]==i)
		{
			prime[m++]=i;
		}
		for(j=1;j<m&&(LL)i*prime[j]<=1000002;j++)
		{
			pri[i*prime[j]]=i;
			if(i%prime[j]==0) break;
		}
	}
}
int get()
{
	mm=1;
	int i,j;
	for(i=1;i<=n;i++)
	{
		_[i]=i;
	}
//	cout<<A[n]<<endl;;
	for(i=1;i<m&&(LL)prime[i]*prime[i]<=A[n];i++)
	{
//		cout<<i<<endl;
		j=A[1]/prime[i]+(A[1]%prime[i]>0);
		if(j==1) j=2;
//		cout<<j*prime[i]<<endl;
		for(;(LL)j*prime[i]<=A[n];j++)
		{
//			cout<<j*prime[i]<<endl;
			if((LL)j*prime[i]>=A[1])
			_[j*prime[i]-A[1]+1]=0;
		}
	}
	nn=1;
	for(i=1;i<=n;i++)
		if(_[i]==i)
			A[nn++]=A[i];
	return 0;
}

int main()
{
	int L,R;
	init();
	while(scanf("%d%d",&L,&R)!=EOF)
	{
		int i;
		 n=0;
		for(i=1; ;i++)
		{
			A[i]=L+i-1;
			if(L+i-1>R) break;
			if(A[i]>=2) A[++n]=A[i];
		}
//		cout<<n<<endl;
//		cout<<A[n]<<endl;
		get();
//		cout<<nn<<endl;
		if(nn<3)
		{
			printf("There are no adjacent primes.\n");
			continue;
		}
		int Min=2;
		int Max=2;
		for(i=3;i<nn;i++)
		{
			if(A[i]-A[i-1]<A[Min]-A[Min-1])
				Min=i;
			if(A[i]-A[i-1]>A[Max]-A[Max-1])
				Max=i;
		}
		printf("%d,%d are closest, %d,%d are most distant.\n",A[Min-1],A[Min],A[Max-1],A[Max]);
	}
	return 0;
}
			


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章