SPOJ(PRIME1)的答案有误

时间:2019-07-10 16:54:33

标签: c++ primes sieve-of-eratosthenes sieve

这是问题的链接-> PRIME1

它要求我们打印两个数字m和n之间的所有素数

我用分段筛解决了问题。将所有素数存储到sqrt(10 ^ 9),并使用它们获得特定范围内的素数。请帮帮我。

#include <iostream>
#include <vector>
using namespace std;

vector<int> v;
vector<bool> prime(32022);
void precompute()
{
    int n=32000;
    prime[0]=prime[1]=true;
    for(int i=2;i*i<=32000;i++)
    {
        for(int j=i*i;j<=32000;j+=i)
            prime[j]=true;
    }
    for(int i=0;i<=32000;i++)
        if(!prime[i]) v.push_back(i);
}

int main() {
    precompute();
    int t; scanf("%d",&t);
    while(t--)
    {
        int m,n; scanf("%d%d",&m,&n);
        if(n<=32000)
        {
            for(int i:v)
            {
                if(i>n) break;
                if(i>=m && i<=n)
                    printf("%d\n",i);
            }
        }
        else
        {
            vector<bool> prime(n-m+1,true);
            for(int i:v)
            {
                int st=(m/i)*i;
                if(st<m) st+=i;
                while(st<=n)
                {
                    prime[st-m]=false;
                    st+=i;
                }
            }
            for(int i=0;i<n-m+1;i++)
            {
                if(prime[i]) printf("%d\n",i+m);
            }
        }
        printf("\n");
    }
}

0 个答案:

没有答案