UVA 1210 - Sum of Consecutive Prime Numbers(暴力枚举)
题目链接 https://cn.vjudge.net/problem/UVA-1210
【题意】
输入整数n(2<=n<=10000)有多少种方案可以把n写成若干个连续素数的和?如41有3种方案 2+3+5+7+11+13,11+14+17,41
【思路】
把10000以内的素数筛出来求一下前缀和,然后暴力枚举起点和终点更新最后的答案数组即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
const int maxa=6000000;
int n,num;
bool notprime[maxn];
vector<int> prime;
int s[maxn],ans[maxa];
void init(){
for(int i=2;i<maxn;++i){
if(!notprime[i]){
prime.push_back(i);
for(int j=i*2;j<maxn;j+=i) notprime[j]=true;
}
}
num=prime.size();
s[0]=0;
for(int i=1;i<=num;++i){
s[i]=s[i-1]+prime[i-1];
}
}
void solve(){
for(int i=1;i<=num;++i){
for(int j=i;j<=num;++j){
int x=s[j]-s[i-1];
++ans[x];
}
}
}
int main(){
init();
solve();
while(scanf("%d",&n)==1 && n){
printf("%d\n",ans[n]);
}
return 0;
}