您的位置:首页 > 其它

BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]

2017-03-08 16:49 176 查看
传送门

题意:

给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图$K_{n,m}$
求生成树个数

1 <= n,m,p <= 10^18

显然不能暴力上矩阵树定理
看过推到完全图的生成树个数后这道题也不难做
构建出基尔霍夫矩阵,找一个主子式,所有行加起来放一行上,用这一行消消消就发现最后对角线上有$n-1$个$m$和$m-1$个$n$和$1$个$1$
然后要用快速乘...蒟蒻第一次用快速乘...

#include <iostream>
using namespace std;
typedef long long ll;
ll n,m,P;
inline void mod(ll &x){if(x>=P) x-=P;}
inline ll Mul(ll a,ll b){
ll re=0;
for(;b;b>>=1,mod(a+=a))
if(b&1) mod(re+=a);
return re;
}
inline ll Pow(ll a,ll b){
ll re=1;
for(;b;b>>=1,a=Mul(a,a))
if(b&1) re=Mul(re,a);
return re;
}
int main(){
//freopen("in","r",stdin);
cin>>n>>m>>P;
cout<<Mul(Pow(n,m-1),Pow(m,n-1));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: