题意
求一边是n个点一边是m个点且有n*m条边的二分图的生成树数量,答案模p。
n,m,p<=10^18
分析
把基尔霍夫矩阵画出来然后乱搞一下就可以得到其余子式的行列式为nm−1∗mn−1
至于long long乘long long的话,用大数相乘取模黑科技即可!
具体看代码。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL n,m,p;
LL mul(LL x,LL y)
{
LL tmp=x*y-(LL)((long double)x*y/p+0.1)*p;
if (tmp<0) tmp+=p;
return tmp;
}
LL ksm(LL x,LL y)
{
LL ans=1;
while (y)
{
if (y&1) ans=mul(ans,x);
x=mul(x,x);y>>=1;
}
return ans;
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&p);
printf("%lld",mul(ksm(n,m-1),ksm(m,n-1)));
return 0;
}