小猴打架:prufer

 

我们概括题意,即将n个点组成一棵树的方案数.

所以是prufer.

又因为要考虑连边顺序,因此再乘上(n-1)!.

唔...难道你们都知道为什么是(n-1)!而不是n!吗...

反正我被这个地方卡了...

我认为选第一个点的方案为n,第二个为n-1,...所以应该是n!..

但是是错的,因为对于每一棵树,它的形态已经固定了,考虑的是连边的顺序.

有n-1条边,也就是(n-1)!...


 

其实我这道题想了很久,我刚开始想的是Catlan数,因为开始选出一个数,后来再在n-1个数中选出一个数

接着在已选出的两个数中选出一个数与n-2个中再选出一个数连边.

也就是C(1,1)*C(n-1,1)*C(2,1)*C(n-2,1).......*C(n-1,1)*C(1,1);

但是样例都过不去,所以我就换了思想,用prufer序列,

但是又卡我,因为我一直想的是n!.

直到看了题解(也没明白)

还是自己想了想才明白.以后还是要多思考啊.

 Code

 

 1 //prufer
 2 #include<cstdio>
 3 #include<cstring>
 4 const int p=9999991;
 5 
 6 int n;
 7 int fac[p];
 8 
 9 int main(){
10     scanf("%d",&n);
11     fac[0]=1;
12     for(int i=1;i<=n-1;++i) fac[i]=1ll*fac[i-1]*i%p;
13     int a=n,b=n-2,ans=1;
14     for(;b;b>>=1,a=1ll*a*a%p)
15         if(b&1) ans=1ll*ans*a%p;
16     ans=1ll*ans*fac[n-1]%p;
17     printf("%d\n",ans);
18     return 0;
19 }

 

posted @ 2019-07-25 17:22  _xuefeng  阅读(236)  评论(1编辑  收藏  举报