DestinHistoire

 

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)    收藏  举报

导航