正题
题目链接:https://www.luogu.org/problemnew/show/P4981
题目大意
求nnn个点的有根树个数。
解题思路
根据CayleyCayleyCayley定理nnn个点的有根树个数是nn−1n^{n-1}nn−1
证明:
先证明标号树枝的个数
先是nnn个没有边的点,加入了kkk条边后剩下的可以加边的个数为n(k−1)n(k-1)n(k−1)
(从任意一个点为根,然后要连接不是这个点所在树枝的根)
然后答案就应该是
∏i=1n−1n(n−i)=nn−1(n−1)!\prod_{i=1}^{n-1}n(n-i)=n^{n-1}(n-1)!i=1∏n−1n(n−i)=nn−1(n−1)!然后不标号的话就是nn−2n^{n-2}nn−2
推导得
- nnn个不同点的有根树个数为nn−1n^{n-1}nn−1
- nnn个不同点的无根树个数为nn−2n^{n-2}nn−2
这道题对应第1种情况
codecodecode
#include<cstdio>
#define ll long long
using namespace std;
ll n,m,p=1e9+9,t;
ll qsm(ll x,ll c)
{x%=p;ll ans=1;while (c){if (c&1) ans=ans*x%p;x=x*x%p;c>>=1;}return ans;}
int main()
{scanf("%lld",&t);while(t--){scanf("%lld",&n);printf("%lld\n",qsm(n,n-1));}
}