BZOJ1430小猴打架——prufer序列
题目描述
一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友。每次打完架后,打架
的双方以及它们的好朋友就会互相认识,成为好朋友。经过N-1次打架之后,整个森林的小猴都会成为好朋友。 现
在的问题是,总共有多少种不同的打架过程。 比如当N=3时,就有{1-2,1-3}{1-2,2-3}{1-3,1-2}{1-3,2-3}{2-3,1
-2}{2-3,1-3}六种不同的打架过程。
输入
一个整数N,N<=10^6
输出
一行,方案数mod 9999991。
样例输入
4
样例输出
96
答案可以看作是生成树个数*生成一棵树的方案数
根据$prufer$序列的性质(即每棵树与其$prufer$序列一一对应),$n$个点的无向完全图的生成树个数为$n^{n-2}$,即$n$个点的有编号无根树个数
生成一棵树有$n-1$条边,那么生成一棵树的方案数就是这$n-1$条边的排列数,即$(n-1)!$
#include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<vector> #include<bitset> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define mod 9999991 using namespace std; int n; ll ans=1ll; int main() { scanf("%d",&n); for(int i=1;i<=n-2;i++) { ans=ans*n%mod; } for(int i=1;i<=n-1;i++) { ans=ans*i%mod; } printf("%lld",ans); }