题目描述
给出一个结点数为 N 的无向完全图,即任意结点两两相连,且每条边长为1。LLJ想知道这个图的生成树个数。但这个数量太大了,LLJ 会懒得看,所以他只想看这个数量模 K 后的结果(若 K=0,输出-1即可)
注:生成树定义:在图中节点数为 N,边数为 N-1 的连通子图。
给出一个结点数为 N 的无向完全图,即任意结点两两相连,且每条边长为1。LLJ想知道这个图的生成树个数。但这个数量太大了,LLJ 会懒得看,所以他只想看这个数量模 K 后的结果(若 K=0,输出-1即可)
注:生成树定义:在图中节点数为 N,边数为 N-1 的连通子图。
输入
输入共一行,两个非负整数 N K;
输入共一行,两个非负整数 N K;
输出
输出共一行一个整数,即方案数模 K 后的结果。
输出共一行一个整数,即方案数模 K 后的结果。
样例输入
样例输入①
1 10
样例输入②
4 13
样例输入③
100 23
样例输出
样例输出①
1
样例输出②
3
样例输出③
3
样例输入①
1 10
样例输入②
4 13
样例输入③
100 23
样例输出
样例输出①
1
样例输出②
3
样例输出③
3
这道题具体的原理我不知道,但一旦看到这种死也不知道怎么做的,可以列出一部分的特例,然后找出规律,正巧这道题有这样的规律:我们发现n=1时,结果为1=1×1;n=2时,结果为1=1×1;n=3时,结果为3=3×1;n=4时,结果为16=4×4.....。继续下去我们会发现有n个节点时,有n^(n-2)个可能。这时我们发现可以用快速幂解决这个问题,下面是快速幂的代码:
long long Pow(long long a, long long b)
{
long long Ans = 1;
while (b)
{
if(b & 1)
Ans = Ans * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return Ans;
}
这就是这道题的做法