计数问题

<span style="font-family:Georgia, Tahoma, sans-serif;font-size:14px;">计数问题
</span>
<span style="font-family:Georgia, Tahoma, sans-serif;font-size:14px;">有一颗又n个节点的树形态不固定。我们对它的形态只有一个要求,那就是同一层的节点所跟的孩子的数目相同,问这个数有多少种形态,结果对1000000007取模
</span>
<span style="font-family:Georgia, Tahoma, sans-serif;font-size:14px;">
</span>

input

<span style="font-family:Georgia, Tahoma, sans-serif;font-size:14px;">每行输入一个数n(1&amp;lt;=n&amp;lt;=1000)</span>

output

<span style="font-family:Georgia, Tahoma, sans-serif;font-size:14px;">输出结果mod1000000007</span>

sample_input

<span style="font-family:Georgia, Tahoma, sans-serif;font-size:14px;">1
2
3
40
50
600
700
</span>

sample_output

<span style="font-family:Georgia, Tahoma, sans-serif;font-size:14px;">1
1
2
924
1998
315478277
825219749
</span>

hint





  AC code:
                     
#include<iostream>
#include<cstdio>
using namespace std;
int ans[1003]={0,1};
int main() {
    for(int i=2;i<=1000;i++) {
        ans[i]=0;
        for(int j=i-1;j>=1;j--) {
            if((i-1)%j==0) ans[i] += ans[j];
            ans[i]%=1000000007;
        }
    }
    int n;
    while(scanf("%d",&n)!=EOF) {
        printf("%d\n",ans[n]);
    }
}
 


AC 2:
<span style="font-family: Arial, Helvetica, sans-serif;">//我们把根节点去掉,得到m棵子树,这些子树的形状一定是相同的,而且节点数也一定相同,</span>
//因此我们考虑 把(n-1)个节点分成m份,F[N]+=F((N-1)/M),因为要平均分,所以M是N-1的约数
#include <iostream>
#include <cstdio>
#include <cstdlib>
#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;
    solve();
    //freopen("data.in","r",stdin);
    //freopen("data.out","w",stdout);
    while(~scanf("%d",&n)){
        printf("%d\n",f[n]);
    }
    return 0;
}









你可能感兴趣的:(思想)