标签:ram turn string oid closed vector ret 题意 clu
Input
Output
Sample Input
2 3 17 41 20 666 12 53 0
Sample Output
1 1 2 3 0 0 1 2
题意:给你一个数,要求找出它能用连续素数相加而成的个数
题解:一看就知道要先来一个素数筛啦。然后用另一个数组保存2到10000的尺取结果,输入后就能直接输出了,刚开始还担心会不会TLE@-@,结果居然只花了188ms
果然还是打表大法好啊
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 using namespace std; const int N=20000+5,maxn=10000+5,inf=0x3f3f3f3f; int p[maxn],ans[maxn]; bool isprime[N]; void getprime() { int k=0; for(int i=0;i<N;i++)isprime[i]=1; isprime[0]=isprime[1]=0; for(int i=2;i<N;i++) { if(isprime[i]) { p[k++]=i; for(int j=2*i;j<N;j+=i) isprime[j]=0; } } } int solve(int x)//对x进行尺取 { int s=0,t=0,sum=0,ans=0; while(t<2000){ while(sum<x&&t<2000){ sum+=p[t]; t++; } if(sum<x)break; if(sum==x)ans++; sum-=p[s]; s++; } return ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); getprime(); for(int i=2;i<=10000;i++)ans[i]=solve(i); int n; while(cin>>n,n){ cout<<ans[n]<<endl; } return 0; }
标签:ram turn string oid closed vector ret 题意 clu
原文地址:http://www.cnblogs.com/acjiumeng/p/6752672.html