BZOJ-4766 文艺计算姬(Prufer序列)
题目描述
给定一个一边点数为 \(n\),另一边点数为 \(m\),共有 \(n\times m\) 条边的带标号完全二分图 \(K_{n,m}\),计算其生成树个数(\(1\leq n,m\leq 10^{18}\))。
分析
在 \(\text{Prufer}\) 序列的构建过程中,最后剩下两个未被删除的点之间一定有边,因此这两个点属于二分图的两个不同集合,除了这两个点之外,每个点都被删除了一次。在删除时,与被删除点连边的点会加入到 \(\text{Prufer}\) 序列中,根据二分图的性质,左部点被加入到 \(\text{Prufer}\) 序列中 \(m-1\) 次,右部点被加入到 $ \text{Prufer}$ 序列中 \(n-1\) 次,即序列中有 \(n-1\) 个右部点和 \(m-1\) 个左部点,则生成树个数为 \(n^{m-1}·m^{n-1}\)。
代码
#include<bits/stdc++.h>
using namespace std;
long long n,m,mod;
long long quick_mul(long long a,long long b)
{
long long ans=0;
while(b)
{
if(b&1)
ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans%mod;
}
long long quick_pow(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b&1)
ans=quick_mul(ans,a)%mod;
a=quick_mul(a,a)%mod;
b>>=1;
}
return ans;
}
int main()
{
cin>>n>>m>>mod;
cout<<quick_mul(quick_pow(n,m-1),quick_pow(m,n-1))%mod<<endl;
return 0;
}
posted on 2020-11-23 15:38 DestinHistoire 阅读(109) 评论(0) 收藏 举报