Chieh's Blog

Because Of Coding

ZOJ Problem Set - 1842 Prime Distance

Chieh posted @ 2018年3月13日 17:10 in ZOJ , 320 阅读

飞机票:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=842

用素数快速筛选法,因为r-l<=1000000,所以只要筛选[l,r]之间的素数,对于1要特殊处理,我是直接当l=1时,l++,因为我的算法是筛[l,r),所以,对于给定的r,要r++;然后就是直接暴力求解了。

#include<iostream>
#include<stdio.h>
typedef long long ll;
using namespace std;
bool is_prime_small[1000009];
bool is_prime[1000009];
///对区间[a,b)内的整数进行筛选。 is_prime[i-a]=true <=> i是素数

void segment_sieve(ll a,ll b)
{
    for(int i=0;(ll)i*i<b;i++)
        is_prime_small[i]=true;
    for(int i=0;i<b-a;i++)
        is_prime[i]=true;
    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]=false;
            for(ll j=max(2LL,(a+i-1)/i)*i;j<b;j+=i)
                is_prime[j-a]=false;
        }
}
int main()
{
    ll a,b,c;
    while(scanf("%lld%lld",&a,&b)!=EOF){
        b++;
        if(a==1)a++;
        segment_sieve( a, b);
        c=b-a;
        ll a1,a2,b1,b2,c1,c2;
        c1=1000000;
        c2=-1;
        ll bef=0;
        
        for(int i=0;i<c;i++)
        {
            if(is_prime[i]) {
                
                if(bef==0){
                    bef=a+i;
                    continue;
                }
                else{
                    ll p=i+a-bef;
                    if(p<c1){
                        c1=p;
                        a1=bef;
                        b1=i+a;
                    }
                    if(p>c2){
                        c2=p;
                        a2=bef;
                        b2=i+a;
                    }
                    bef=i+a;
                }
            }
        }
        if(c2==-1){
            printf("There are no adjacent primes.\n");
        }
        else{
            printf("%lld,%lld are closest, %lld,%lld are most distant.\n",a1,b1,a2,b2);
        }
    }
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter