小猴打架: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 }
Keep it simple and stupid.