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;
}

 

posted @ 2019-09-06 08:08  水题收割者  阅读(164)  评论(0编辑  收藏  举报