來自《挑戰程序設計競賽》
1.題目原文
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 23592 | Accepted: 12887 |
Description
numbers, so neither 7 + 13 nor 3 + 5 + 5 + 7 is a valid representation for the integer 20.
Your mission is to write a program that reports the number of representations for the given positive integer.
Input
Output
Sample Input
2 3 17 41 20 666 12 53 0
Sample Output
1 1 2 3 0 0 1 2
Source
2.解題思路
3.AC代碼
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<string>
#include<set>
#include<vector>
#include<cmath>
#include<bitset>
#include<stack>
#include<sstream>
#include<deque>
#include<utility>
using namespace std;
#define INF 0x7fffffff
#define maxn 10005
int prime[maxn];
bool is_prime[maxn];//is_prime[i]是true表示i是素數
//返回n以內素數的個數
int sieve(int n)
{
int p=0;
for(int i=0;i<=n;i++) is_prime[i]=true;
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=n;i++){
if(is_prime[i]){
prime[p++]=i;
for(int j=2*i;j<=n;j+=i) is_prime[j]=false;
}
}
return p;
}
int n;
void solve()
{
int p=sieve(n);
int s=0,t=0,sum=0;
int res=0;
for(;;){
while(t<p&&sum<n){
sum+=prime[t++];
}
if(sum<n) break;
else if(sum==n){
res++;
}
sum-=prime[s++];
}
printf("%d\n",res);
}
int main()
{
while(scanf("%d",&n)!=EOF&&n){
solve();
}
return 0;
}