题目链接:https://www.luogu.org/problemnew/show/P4981
首先,这道题目与小猴打架这道题目很相似(小猴打架题目链接)
小猴打架求的是:n个有序点的无根树个数
而这道题目所求的是:n个无序点的有根树个数
这里引入几个公式:
1、n个无序点的有根树个数为nn-1
2、n个无序点的无根树个数为nn-2
3、n个有序点的有根树个数为nn-1(n-1)!
4、n个有序点的无根树个数为nn-2(n-1)!
有了这些公式,我们只要对题目要求我们计算的东西进行分析即可
比如这道父子题目,表面上是求所有可以构成父子关系的情况总数,实则求n个无序点的有根树个数
所以对于这种表示有一定的联通块意味的题目,求方案总数,对题目和样例进行分析,讨论出使用上述哪个公式即可。
P.S.这道题目求nn-1,考虑到n的范围为109,这里使用快速幂求解
上代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int MOD=1e9+9; 6 typedef long long ll; 7 ll quickpow(ll x,ll n) 8 { 9 ll res=1; 10 while(n>0) 11 { 12 if(n%2==1) 13 res=res*x%MOD;//这里注意:不可以打成res*=,否则答案错误(下同) 14 x=x*x%MOD; 15 n>>=1; 16 } 17 return res; 18 } 19 int main() 20 { 21 ll t,n; 22 cin>>t; 23 while(t--) 24 { 25 cin>>n; 26 cout<<quickpow(n,n-1)%MOD<<endl; 27 } 28 return 0; 29 }
总结:对于此类求特定关系的方案数的题目,考虑以上4个公式的情况,并合理应用