问题 Q: 【组合数学】质数分解问题
题目描述
任何大于1的自然数n都可以写成若干个大于等于2且小于等于n的质数之和的表达式(包括只有一个数构成的质数之和的表达式的情况),并且可能有不止一种质数和的形式。例如9的质数和表达式就有4种本质上不同的形式:
9=2+5+2=2+3+2+2=3+3+3=2+7
这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式。
输入
一个自然数n(2<n<200)。
输出
一个整数,表示自然数n可以写成多少种本质不同的质数和表达式。
样例输入 Copy
9
样例输出 Copy
4
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int>v;
int a[210];
int prime[60];
int ans[205],tot;
int getprime(int n)
{
int cnt=0;
for(int i=2;i<=n;i++)
{
if(a[i]==0) prime[cnt++]=i;
for(int j=0;j<cnt&&prime[j]*i<=n;j++)
{
a[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
return cnt;
}
int main()
{
int x;
cin>>x;
tot=getprime(x);
ans[0]=1;
for(int i=0;i<tot;i++)
for(int j=prime[i];j<=x;j++)
ans[j]+=ans[j-prime[i]];
cout<<ans[x]<<endl;
return 0;
}