(本题取 $n=1000000$,$m$ 为不超过 $n$ 的质数个数)
【思路】欧拉筛初始化后,采用前缀和预处理,一旦超过 $n$ 就不再继续做下去,这样会减小后续枚举范围。
紧接着在所有质数中枚举作为起始质数,然后取连续的 $maxl+1$ 个质数得到它们的和(规定 $maxl$ 为当前最多质数的个数),再判断是否为质数即可。
总体时间复杂度为 $\mathcal O(n+m^2)$:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<stdio.h> #include<stdbool.h> const int maxn=1000000; int cnt,ans,maxl,prime[maxn]; long long s[maxn]; bool vis[maxn]; void euler() { vis[0]=vis[1]=true; for(int i=2;i<=maxn;++i) { if(!vis[i])prime[++prime[0]]=i; for(int j=1;i*prime[j]<=maxn&&j<=prime[0];++j) { vis[i*prime[j]]=true; if(i%prime[j]==0)break; } } } int main() { euler(); s[1]=prime[1]; for(int i=2;i<=prime[0];++i) { s[i]=s[i-1]+prime[i]; if(s[i]>1000000) { cnt=i; break; } } for(int i=1;i<=cnt;++i) { int sum=0; for(int j=i+maxl+1;j<=cnt&&s[j]-s[i-1]<=maxn;++j) { if(!vis[s[j]-s[i-1]]) { maxl=j-i; ans=s[j]-s[i-1]; } } } printf("%d",ans); return 0; }
|