P4981 父子(树的组成情况+Cayley公式)
题目描述:
那么现在问题来了,对于一个有 n 个人的寝室,最多可能存在多少种父子关系,当然每个人之间都必须要有直接或间接的父子关系。
思路:Cayley公式:
对于n个不同的节点,能够组成的无根树(原来是无向连通图或者是有标志节点的树)的种数是n^(n−2)种。(这里让大家好理解一点,就写成了无根树,其实应该是一样的概念)
把有根树转换成根节点有n种情况的无根树,也就是n^(n−2)×n,化简就是n^(n−1)。答案也就是这个玩意了。
再用快速幂求解
AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 10000005; const ll inf = 0x3f3f3f3f; const ll mod = 1e9+9; ll qpow(ll a, ll n, ll p) { ll res = 1; while (n) { if (n & 1)res = (res * a) % p; a = (a * a) % p; n >>= 1; } return res; } int main() { int t; scanf("%d", &t); while (t--) { ll n; scanf("%lld", &n); cout << qpow(n, n - 1, mod) << endl; } return 0; }