Sasha and Interesting Fact from Graph Theory CodeForces - 1109D (图论,计数)

大意: 求a->b最短路长度为m的n节点树的个数, 边权全部不超过m

枚举$a$与$b$之间的边数, 再由拓展$Caylay$定理分配其余结点

拓展$Caylay$定理

$n$个有标号节点生成k棵树的森林, 且给定$k$个点各属于$k$棵树的方案数为$kn^{n-k-1}$

可以得到有$x$条边的方案数为$\binom{m-1}{x-1}\binom{n-2}{x-1}(x-1)!m^{n-1-x}(x+1)n^{n-x-2}$

int n, m;
ll fac[N], ifac[N];
ll C(int x, int y) {
    if (y>x) return 0;
    return fac[x]*ifac[y]%P*ifac[x-y]%P;
}

void init() {
    fac[0]=ifac[0]=fac[1]=ifac[1]=1;
    REP(i,2,N-1) fac[i]=fac[i-1]*i%P,ifac[i]=inv(fac[i]);
}

int main() {
    scanf("%d%d%*d%*d", &n, &m);
    init();
    ll ans = 0;
    REP(i,1,n-1) {
        ll t = C(m-1,i-1)*C(n-2,i-1)%P*fac[i-1]%P*qpow(m,n-1-i)%P;
        if (i!=n-1) t = t*(i+1)%P*qpow(n,n-i-2)%P;
        (ans+=t)%=P;
    }
    printf("%lld\n", ans);
}

 

猜你喜欢

转载自www.cnblogs.com/uid001/p/10506111.html
今日推荐