題目描述 任何大於 1 的自然數 n 都可以寫成若幹個大於等於 2 且小於等於 n 的質數之和表達式(包括只有一個數構成的和表達式的情況),並且可能有不止一種質數和的形式。例如,9 的質數和表達式就有四種本質不同的形式: 9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + ...
題目描述
任何大於 1 的自然數 n 都可以寫成若幹個大於等於 2 且小於等於 n 的質數之和表達式(包括只有一個數構成的和表達式的情況),並且可能有不止一種質數和的形式。例如,9 的質數和表達式就有四種本質不同的形式:
9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 。
這裡所謂兩個本質相同的表達式是指可以通過交換其中一個表達式中參加和運算的各個數的位置而直接得到另一個表達式。
試編程求解自然數 n 可以寫成多少種本質不同的質數和表達式。
輸入輸出格式
輸入格式:
文件中的每一行存放一個自然數 n(2 < n < 200) 。
輸出格式:
依次輸出每一個自然數 n 的本質不同的質數和表達式的數目。
輸入輸出樣例
輸入樣例#1:2 200輸出樣例#1:
1 9845164先生成一個質數表然後用個小背包就可以了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #define lli long long int 7 using namespace std; 8 void read(lli &n) 9 { 10 char c='+';lli x=0;bool flag=0; 11 while(c<'0'||c>'9') 12 {c=getchar();if(c=='-')flag=1;} 13 while(c>='0'&&c<='9') 14 {x=x*10+(c-48);c=getchar();} 15 flag==1?n=-x:n=x; 16 } 17 lli n,m; 18 lli a[10001]; 19 lli dp[10001]; 20 lli sum[10001]; 21 lli vis[10001]; 22 int main() 23 { 24 dp[0]=1; 25 vis[1]=1; 26 for(lli i=2;i<=201;i++) 27 if(!vis[i]) 28 for(lli j=i*i;j<=301;j+=i) 29 vis[j]=1; 30 for(lli i=2;i<=200;i++) 31 if(vis[i]==0) 32 for(lli j=i;j<=200;j++) 33 dp[j]=dp[j-i]+dp[j]; 34 while(scanf("%d",&n)==1) 35 { 36 printf("%lld\n",dp[n]); 37 } 38 return 0; 39 }