p4161 [SCOI2009]游戏
分析
我们知道对于一个置换它变回自己需要的次数树$LCM(g_1,g_2..,g_n)$
有$LCM = \prod p_i^{k_i}$
因为循环大小为1没有贡献
所以对于该等式的限制即为
$\sum p_i^{k_i} \leq n$
用$dp_i$表示大小为$i$时的方案数即可
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int p[1100],cnt,is[1100],dp[1100];
signed main(){
int n,m,i,j,k;scanf("%lld",&n);
for(i=2;i<=n;i++)if(!is[i]){p[++cnt]=i;for(j=i;j<=n;j+=i)is[j]=1;}
dp[0]=1;for(i=1;i<=cnt;i++)for(j=n;j>=p[i];j--)for(k=p[i];k<=j;k*=p[i])dp[j]+=dp[j-k];
for(i=1;i<=n;i++)dp[i]+=dp[i-1];printf("%lld\n",dp[n]);
return 0;
}