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
原文地址:https://www.cnblogs.com/bxd123/p/12236000.html