Description
任何大于 1 的自然数 n,都可以写成若干个大于等于 2 ,且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式。例如9 的质数和表达式就有四种本质不同的形式:
9 = 2+5+2 = 2+3+2+2 = 3+3+3 = 2+7 。
这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式。
试编程求解自然数 n 可以写成多少种本质不同的质数和表达式。
Input
Output
Sample Input
任何大于 1 的自然数 n,都可以写成若干个大于等于 2 ,且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式。例如9 的质数和表达式就有四种本质不同的形式:
9 = 2+5+2 = 2+3+2+2 = 3+3+3 = 2+7 。
这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式。
试编程求解自然数 n 可以写成多少种本质不同的质数和表达式。
Input
每一行存放一个自然数 n , 2≤n≤200
Output
输出每一个自然数 n 的本质不同的质数和表达式的数目
Sample Input
1
1
解题思路
这道题(TM)一看就是方案数水的一匹。
代码:
#include<cstdio>
int f[201],n,s[47],k;
int main()
{
scanf("%d",&n);
bool flag;
for (int i=2;i<=n;i++)
{
flag=true;
for (int j=2;j<=i/2;j++) if (i%j==0) {flag=false; break;}
if (flag)
{
k++;
s[k]=i;
}
}//筛1-n里的素数
f[0]=1;//初始化
for (int i=1;i<=k;i++)
if (s[i]<=n)//判断这个素数是否在1-n的范围内
//其实没必要╮(╯_╰)╭
for (int j=0;j<=n-s[i];j++)
f[j+s[i]]+=f[j];//累加方案数
printf("%d",f[n]);
}