CF1109D Sasha and Interesting Fact from Graph Theory 组合数

Posted bxd123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1109D Sasha and Interesting Fact from Graph Theory 组合数相关的知识,希望对你有一定的参考价值。

 

题意:

给定参数 n,m,a,bn,m,a,b

你现在要构造一颗 nn 个点树,树边的权值可以赋为 [1,m][1,m]中的一个整数。

求有多少种构造树的方法,使得节点 aa 与节点 bb 在树上的最短路径恰好为 mm 。

对 10^9+7109+7 取模

题解:

组合数处理一下,还要用到下面的公式:

Cayley公式:

技术图片

 

 

技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+1000;
const ll mod=1e9+7;

ll fac[N],inv[N];
ll fast(ll x,ll n) {
    ll ans=1;
    for(;n;n>>=1,x=x*x%mod)
        if(n&1) ans=ans*x%mod;
    return ans;
}
ll init(){
    fac[0]=fac[1]=1;
    for(int i=2;i<N;i++) fac[i]=fac[i-1]*i%mod;
    inv[N-1]=fast(fac[N-1],mod-2);
    for(int i=N-2;i>=0;i--)
        inv[i]=(inv[i+1]*(i+1))%mod;
}
ll C(ll n,ll m) {
    if(!m||m==n) return 1;
    return ((fac[n]*inv[m]%mod*inv[n-m])%mod);
}

int main() {
    init();
    ll n,m,a,b;
    cin>>n>>m>>a>>b;
    ll ans=0;
    for(ll i=0;i<=n-2&&i<=m-1;i++) {
        if(i==n-2)
            ans=(ans+C(n-2,i)*C(m-1,i)%mod*fac[i]%mod)%mod;
        else
            ans=(ans+C(n-2,i)*C(m-1,i)%mod*fac[i]%mod*(i+2)%mod*fast(n,n-i-3)%mod*fast(m,n-i-2))%mod;
    }
    cout<<ans;
}
View Code

 

以上是关于CF1109D Sasha and Interesting Fact from Graph Theory 组合数的主要内容,如果未能解决你的问题,请参考以下文章

题解 CF718C Sasha and Array

cf-Sasha and Array

题解 CF718C Sasha and Array

CF1109A Sasha and a Bit of Relax

CF1109B Sasha and One More Name

线段树维护矩阵CF718C Sasha and Array