洛谷P4981 父子 题解
题目链接:P4981 父子
题意:
对于全国各大大学的男生寝室,总是有各种混乱的父子关系。
那么假设现在我们一个男生寝室有不同的 $n$ 个人,每个人都至多有一个“爸爸”,可以有多个“儿子”,且有且只有一个人没有“爸爸”(毕竟是室长,还是要给点面子,当然了,室长人人当嘛)。
那么现在问题来了,对于一个有 $n$ 个人的寝室,最多可能存在多少种父子关系,当然每个人之间都必须要有直接或间接的父子关系。
输入格式:
第一行一个 正整数 $t$,表示有组数据。
接下来 $t$ 行,每行一个整数 $n$,表示有 $n$ 个人。
输出格式:
共 $t$ 行,每行一个整数,求关系个数。
由于答案可能较大,则我们需要输出答案对 $10^9+9$ 取模的值。
数据范围:
对于 $100\%$ 的数据,$t≤10^4$,$n≤10^9$。
$n$ 个不同结点的有根树数量
显然等于「 $n$ 个不同结点的无根树的数量」 乘以 $n$
根据 Cayley 公式,前者就是 $n^{n-2}$ (不知道戳这里)
时间复杂度 $O(Q \log n)$
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N ((int)())
const int mod = 1e9+9;
int qpow(int a,int b)
{
int ans=1,base=a%mod;
for(; b; b>>=1)
{
if(b&1)ans=ans*base%mod;
base=base*base%mod;
}
return ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("check.in","r",stdin);
// freopen("check.out","w",stdout);
int Q,n; cin >> Q;
while(Q--)
{
cin >> n;
// 不要用 n * qpow(n-2) % mod
// 因为没有保证 n ≥ 2
cout << qpow(n,n-1) % mod << '\n';
}
return 0;
}