bzoj1025 [SCOI2009]游戏——因数DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1025
这篇博客写得真好呢:https://www.cnblogs.com/phile/p/4473192.html
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,pri[1005],cnt; long long f[1005][1005],ans; bool vis[1005]; void init() { for(int i=2;i<=n;i++) { if(!vis[i])vis[i]=1,pri[++cnt]=i; for(int j=1;j<=cnt&&i*pri[j]<=n;j++) { vis[i*pri[j]]=1; if(i%pri[j]==0)break; } } } int main() { scanf("%d",&n); init(); f[0][0]=1; for(int i=1;i<=cnt;i++) { for(int j=0;j<=n;j++)f[i][j]+=f[i-1][j]; for(int j=0;j<=n;j++) for(int k=pri[i];j-k>=0;k*=pri[i]) f[i][j]+=f[i-1][j-k]; } for(int i=0;i<=n;i++) ans+=f[cnt][i]; printf("%lld",ans); return 0; }