https://www.luogu.com.cn/problem/P1832
思路:预处理出素数,
d
p
[
i
]
dp[i]
dp[i]表示将
i
i
i分解的方案数,那么对于任意一个素数
p
r
i
pri
pri,有:
d
p
[
i
]
+
=
d
p
[
i
−
p
r
i
]
dp[i]+=dp[i-pri]
dp[i]+=dp[i−pri]
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pr pair<int,int>
using namespace std;
typedef long long ll;
const int maxn=1005;
int n,m;
int pri[maxn];
ll dp[maxn];
bool prime(int x)
{
if(x==2||x==3)
return 1;
for(int i=2;i*i<=x;i++)
if(x%i==0)
return 0;
return 1;
}
int main()
{
scanf("%d",&m);
n=1;
pri[1]=2;
for(int i=3;i<=m;i+=2)
if(prime(i))
pri[++n]=i;
dp[0]=1;
for(int i=1;i<=n;i++)
for(int j=pri[i];j<=m;j++)
dp[j]+=dp[j-pri[i]];
printf("%lld\n",dp[m]);
return 0;
}