父子关系

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

转载于:https://www.cnblogs.com/cptbtptpbcptbtptp/p/11143944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值