题意:

找环

有多少种不同的排列

使排列数目为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;
}

 

posted on 2018-02-13 10:07  宣毅鸣  阅读(94)  评论(0编辑  收藏  举报