题意:
找环
有多少种不同的排列
使排列数目为n
题解:
考虑dp
f[i][j]表示前i个质数,和为j的方案数
然后转移一下即可
代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=105; int n,tot,mark[N],pri[N]; ll ans,f[N][N]; int main() { scanf("%d",&n); for (int i=2;i<N;i++) { if (!mark[i])pri[++tot]=i; for (int j=1;j<=tot&&i*pri[j]<=1000;j++) { mark[i*pri[j]]=1; if (i%pri[j]==0)break; } } f[0][0]=1; for(int i=1;i<=tot;i++) { for (int j=0;j<=n;j++)f[i][j]=f[i-1][j]; for (int j=pri[i];j<=n;j*=pri[i]) for (int k=0;k<=n-j;k++)f[i][k+j]+=f[i-1][k]; } for (int i=0;i<=n;i++)ans+=f[tot][i]; printf("%lld",ans); return 0; }