素数距离 pku2689

注意l=0的时候特判一下,而且这方法的取值范围是[l,u)


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
#define maxn 1000010
#define maxn_b 50001
typedef long long ll;

int is_prime[maxn];     //b-a的范围 
int is_prime_small[maxn_b];    //素数的范围 
ll l,u;
//注意a==0的时候需要特判一下 
void segment_sieve(ll a,ll b)
{
	for(int i=0;(ll)i*i<b;i++)    is_prime_small[i]=1;
	for(int i=0;i<b-a;i++)        is_prime[i]=1;
	for(int i=2;(ll)i*i<b;i++)
	{
		if(is_prime_small[i])
		{
			for(int j=2*i;(ll)j*j<b;j+=i)  is_prime_small[j]=0;  //筛选(2,sqrt(b))
			for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) 
			{
				//cout<<"j: "<<j<<endl;
				is_prime[j-a]=0; 
			} 
		}
	}
	if(a==1)        //*********attention********** 
	is_prime[0]=0;
	/*for(int i=0;i<b;i++)
	cout<<is_prime_small[i]<<" ";
	cout<<endl; 
	for(int i=0;i<b-a;i++)
	cout<<is_prime[i]<<" ";
	cout<<endl;*/
}

void solve(ll a,ll b)
{
	ll minl=b-a,maxl=0,max_a,max_b,min_a,min_b;
	int k=0;
	for(int i=0;i<b-a;i++)
	{
		if(is_prime[i])
		is_prime[k++]=i+a;
	}
	/*for(int i=0;i<k;i++)
	cout<<is_prime[i]<<" ";
	cout<<endl;*/
	for(int i=1;i<k;i++)
	{
		ll dis=is_prime[i]-is_prime[i-1];
		if(dis>maxl)
		{
			maxl=dis;
			max_a=is_prime[i-1];
			max_b=is_prime[i];
		}
		if(dis<minl)
		{
			minl=dis;
			min_a=is_prime[i-1];
			min_b=is_prime[i];
		}
	}
	if(k<=1)
	cout<<"There are no adjacent primes."<<endl;
	else
	cout<<min_a<<","<<min_b<<" are closest, "<<max_a<<","<<max_b<<" are most distant."<<endl;
}    

int main()
 {
 	#ifndef ONLINE_JUDGE
 	//freopen("in.txt","r",stdin);
 	#endif
 	ios::sync_with_stdio(false);
 	cin.tie(0);
    while(cin>>l>>u)
    {
    	segment_sieve(l,u+1);
    	solve(l,u+1);
	}
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值