1. 程式人生 > >省選專練之文藝計算姬

省選專練之文藝計算姬

“奮戰三星期,造臺計算機”。小W響應號召,花了三星期造了臺文藝計算姬。

文藝計算姬比普通計算機有更多的藝術細胞。 普通計算機能計算一個帶標號完全圖的生成樹個數,而文藝計算姬能計算一個帶標號完全二分圖的生成樹個數。

更具體地,給定一個一邊點數為n,另一邊點數為m,共有n*m條邊的帶標號完全二分圖K_{n,m},計算姬能快速算出其生成樹個數。

小W不知道計算姬算的對不對,你能幫助他嗎?

這實際上是喜聞樂見的**計數類問題
這道題的解決方法是Prufer序列
我們知道在求一棵樹的Prufer序列的時候還剩下最後兩個點
他們必然是兩個劃分集合中的
而此時說明有n-1個和m-1個被選了
那麼按照Prufer的性質
一個點出現了幾次和他的度數有關
那麼這個點出現幾次可以隨便選
為: N

M 1 M N 1
N^{M-1}*M^{N-1}

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL mod,n,m;
LL mul(LL A,LL B){
	LL ret=0;
	while(B){
		if(B&1)ret=(ret+A)%mod;
		A=(A+A)%mod;
		B=B>>1;
	}
	return ret;
}
LL Quick_Pow(LL x,LL k){
	LL ret=1;
	while(k){
		if(k&1)ret=mul(ret,x)%mod;
		x=mul(x,x)%mod;
		k=k>>1;
	}
	return ret;
}
int main(){
	cin>>n>>m>>mod;
	cout<<mul(Quick_Pow(n,m-1),Quick_Pow(m,n-1));
}