Prime Distance Page138 区间质数

Prime Distance Page138 区间质数

由于L,R太大,一开始想到用map表示该值是否为质数,后来一直T,把质数筛选过程优化到 ( R L ) l o g l o g ( R ) (R-L)loglog(R) 还是过不了,怀疑应该是map的原因

修改后用 i s p r i m e [ i L ] isprime[i-L] ,即可用数组存,一个细节就是如果L是1的话,它不会被 m m 个质数(因为最小的质数为2)给筛为合数,故默认1为质数,但其实1不是质数,所以此时需要特判

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<queue>
#include<map>
#define ll long long
#define pb push_back
#define rep(x,a,b) for (int x=a;x<=b;x++)
#define repp(x,a,b) for (int x=a;x<b;x++)
#define W(x) printf("%d\n",x)
#define WW(x) printf("%lld\n",x)
#define pi 3.14159265358979323846
#define mem(a,x) memset(a,x,sizeof a)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int maxn=2e6+7;
const int INF=1e9;
const ll INFF=1e18;
bool prime[maxn],isprime[maxn];
ll primenum[maxn];
ll m=0,L,R;
vector<int> V;
void prime_init()
{
    mem(prime,true);
    prime[0]=prime[1]=false;
    repp(i,2,maxn)
    {
        if (prime[i])primenum[m++]=i;
        for (int j=0;j<m&&primenum[j]*i<maxn;j++)
        {
            prime[i*primenum[j]]=false;
            if (i%primenum[j]==0)break;
        }
    }
}
int main()
{
    prime_init();
    while(~scanf("%lld%lld",&L,&R))
    {
        V.clear();
        mem(isprime,true);
        if (L==1)isprime[0]=false;
        for (int i=0;i<m&&primenum[i]<=sqrt(R);i++)
        {
            for (int j=L/primenum[i];j<=R/primenum[i];j++)
            {
                if (j>1)isprime[primenum[i]*j-L]=false;
            }
        }
        rep(i,L,R)if (isprime[i-L])V.pb(i);
        if (V.size()<2)printf("There are no adjacent primes.\n");
        else
        {
            int x1,y1,x2,y2,minn=INF,maxx=0;
            repp(i,0,V.size()-1)
            {
                if (V[i+1]-V[i]<minn)
                {
                    x1=V[i];
                    y1=V[i+1];
                    minn=y1-x1;
                }
                if (V[i+1]-V[i]>maxx)
                {
                    x2=V[i];
                    y2=V[i+1];
                    maxx=y2-x2;
                }
            }
            printf("%d,%d are closest, %d,%d are most distant.\n",x1,y1,x2,y2);
        }
    }
    return 0;
}
发布了125 篇原创文章 · 获赞 8 · 访问量 9106

猜你喜欢

转载自blog.csdn.net/w_udixixi/article/details/104905438