您的位置:首页 > 其它

计数问题

2015-04-16 17:44 190 查看
<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&lt;=n&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
);
}
}
 

AC 2:
<span style="font-family: Arial, Helvetica, sans-serif;">//我们把根节点去掉,得到m棵子树,这些子树的形状一定是相同的,而且节点数也一定相同,</span>
//因此我们考虑 把(n-1)个节点分成m份,F
+=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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  思想