zoukankan      html  css  js  c++  java
  • BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]

    传送门

    题意:

    给定一个一边点数为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));
    }
     
     
  • 相关阅读:
    博客
    参考博客
    KMP
    串匹配
    简单数论
    B
    各种常用函数的模板以及自己的测试数据
    header
    memcached的图形界面监控
    缓存策略
  • 原文地址:https://www.cnblogs.com/candy99/p/6520181.html
Copyright © 2011-2022 走看看