UVA1210 连续素数之和 Sum of Consecutive Prime Numbers扫出
扫出1~10000内的所有素数,记录素数前缀和。
然后暴力O(n^2)。
还有个思路是用队列,一直往上加,不满足出队,O(n)就可以
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 const int MAXN=1e4+5; 6 7 ll sum[MAXN]; 8 9 bool is_prime[MAXN]; 10 int prime[MAXN]; 11 int sieve(int n) 12 { 13 for(int i=0;i<=n;i++) 14 is_prime[i]=true; 15 is_prime[0]=is_prime[1]=false; 16 int p=0; 17 for(int i=1;i<=n;i++) 18 { 19 if(is_prime[i]) 20 { 21 prime[++p]=i; 22 for(int j=i*2;j<=n;j+=i) 23 { 24 is_prime[j]=false; 25 } 26 } 27 } 28 return p; 29 } 30 31 32 int main() 33 { 34 int n; 35 int p=sieve(10000); 36 //freopen("a.txt","r",stdin); 37 for(int i=1;i<=p;i++) 38 { 39 sum[i]+=prime[i]+sum[i-1]; 40 } 41 while(cin>>n) 42 { 43 ll ans=0; 44 if(n==0) break; 45 for(int i=1;i<=p;i++) 46 { 47 if(prime[i]>n) break; 48 for(int j=i;j<=p;j++) 49 { 50 if(sum[j]-sum[i-1]==n) ans++; 51 } 52 } 53 cout <<ans<<endl; 54 } 55 return 0; 56 }