将一个数分解为若干质数的和,每个质数都不同,质数不超过2500
ac:
不知道正确否,如有错误,欢迎提示
#include<bits/stdc++.h>
#define ll long long
#define MAXN 1000005
using namespace std;
int prime[MAXN];//保存素数
bool vis[MAXN];//初始化
int cnt,y;
ll ans;
void getprime(int n)
{
cnt=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<n;i++)
{
if(!vis[i])
prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<n;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0)
break;
}
}
}
ll dp[20000][2000]={0};//和为i,最大为j的数目
int main()
{
scanf("%d",&y);
ans=0;
getprime(y);
sort(prime,prime+cnt);
for(int i=cnt;i>=1;i--)
prime[i]=prime[i-1];
prime[0]=0;
ll qc=0,gc=0;
dp[0][0]=1;//0层0值出发
for(int i=0;i<=y;i++)//值
{
for(int j=0;j<=cnt&&prime[j]<=i;j++)//当前层数
{
gc++;
if(dp[i][j]==0)//无意义
continue;
for(int k=j+1;k<=cnt;k++)//加的层数
{
if(i+prime[k]>y)//超限无意义
break;
dp[i+prime[k]][k]+=dp[i][j];
qc++;
}
}
}
ll ans=0;
for(int i=1;i<=cnt;i++)
ans+=dp[y][i];
printf("%lld\n",ans);
return 0;
}
也是计算类型的,是状压dp: G1. Playlist for Polycarp (easy version)(状压dp)