https://vjudge.net/problem/UVA-1210
题意:
输入整数n,有多少种方案可以把n写成若干个连续素数之和?
思路:
先素数打表,然后求个前缀和。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 typedef long long ll; 8 9 const int maxn=10000+5; 10 11 int n; 12 13 int primes[maxn]; 14 ll sum[maxn]; 15 int vis[maxn]; 16 int cnt; 17 18 void get_prime() 19 { 20 cnt=0; 21 int m = sqrt(maxn + 0.5); 22 memset(vis, 0, sizeof(vis)); 23 for (int i = 2; i < m;i++) 24 { 25 if(!vis[i]) 26 { 27 for(int j=i*i;j<maxn;j+=i) 28 vis[j]=1; 29 } 30 } 31 sum[0]=0; 32 for(int i=2;i<=maxn;i++) 33 { 34 if(!vis[i]) 35 { 36 primes[++cnt]=i; 37 sum[cnt]=sum[cnt-1]+i; 38 } 39 } 40 } 41 42 43 int main() 44 { 45 //freopen("D:\input.txt", "r", stdin); 46 get_prime(); 47 while(cin>>n && n) 48 { 49 int ans=0; 50 for(int i=1;i<=cnt;i++) 51 for(int j=0;j<i;j++) 52 if(sum[i]-sum[j]==n) ans++; 53 cout<<ans<<endl; 54 } 55 return 0; 56 }