题意:
给定参数 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