首页 > 代码库 > HDU4472 Count(递推)

HDU4472 Count(递推)

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4472


题目大意:

给你n个节点的一个树,第一层只有一个节点,然后剩下的同一层的节点的孩子数要相同,问这个数有多少种结构


分析:

我们把根节点去掉,得到m棵子树,这些子树的形状一定是相同的,而且节点数也一定相同,

因此我们考虑 把(n-1)个节点分成m份,F[N]+=F((N-1)/M),因为要平均分,所以M是N-1的约数


代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

typedef long long LL;
const int mod = 1000000007;
const int maxn = 1010;

LL f[maxn];

int a[maxn];
int cnt;

void init(int n)
{
    cnt=0;
    memset(a,0,sizeof(a));
    for(int i=1;i*i<=n;i++){
        if(n%i==0){
            a[cnt++]=i;
            if(i*i!=n)
                a[cnt++]=n/i;
        }
    }
}

void solve()
{
    memset(f,0,sizeof(f));
    f[1]=1;
    for(int i=2;i<=1001;i++){
        init(i-1);
        for(int j=0;j<cnt;j++)
            f[i]=(f[i]+f[(i-1)/a[j]])%mod;
    }
}

int main()
{
    int n,cas=1;
    solve();
    while(~scanf("%d",&n)){
        printf("Case %d: %d\n",cas++,f[n]);
    }
    return 0;
}


HDU4472 Count(递推)