B-Sum of Consecutive Prime Numbers_牛客竞赛数学专题班整数分解与筛法(重现赛)@lamentropetion (nowcoder.com)
题意:
![](https://img-blog.csdnimg.cn/img_convert/b441b06d42560c513f598dcb8cd7a098.png)
思路:
注意到可以把所有质数筛出来之后尺取法求所有和为n的区间
如果不是4e7可以用背包n2做
Code:
#include <bits/stdc++.h>
using namespace std;
//#define int long long
using i64 = long long;
const int mxn=4e7+10;
const int mxe=1e8+10;
const int mod=1e9+7;
int n,len=0;
int prime[mxn],vis[mxn];
i64 sum[mxn];
void p_init(int n){
for(int i=2;i<=n;i++){
if(!vis[i]) prime[++len]=i;
for(int j=1;i<=n/prime[j];j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
for(int i=1;i<=len;i++) sum[i]=sum[i-1]+prime[i];
}
void solve(){
cin>>n;
int ans=0;
for(int l=1,r=1;l<=len;l++){
if(prime[l]>n) break;
while(r<=len&&prime[r]<=n&&sum[r]-sum[l-1]<n) r++;
if(sum[r]-sum[l-1]==n*1ll){
ans++;
}
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
p_init(4e7);
while(__--)solve();return 0;
}