父子关系

题目链接: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个公式的情况,并合理应用

posted @ 2019-07-06 19:58  LyingFlat666  阅读(285)  评论(0编辑  收藏  举报