首页 > 其他 > 详细

「雅礼集训2017」共

时间:2020-06-11 22:53:26      阅读:52      评论:0      收藏:0      [点我收藏+]

传送门

把这棵树分为奇数深度点和偶数深度点两部,显然形成二分图。

我们先选出 \(k\) 个点作为奇数深度的点,由于 \(1\) 号点必须是奇数深度,所以方案就是 \({n - 1 \choose k - 1}\)

考虑 \(prufer\) 序列,我们不难发现奇数深度点总共出现 \(n - 1 - k\) 次,偶数深度点总共出现 \(k - 1\) 次,那么就是 \(k ^ {n - 1 - k}(n - k)^{k - 1}\)

最后的答案就是 \({n - 1 \choose k - 1}k ^ {n - 1 - k}(n - k)^{k - 1}\)

参考代码:

#include <cstdio>

const int _ = 5e5 + 5;

int n, k, p, fac[_], ifc[_];

int C(int N, int M) { return 1ll * fac[N] * ifc[M] % p * ifc[N - M] % p; }

int power(int x, int k) {
    int res = 1;
    for (; k; k >>= 1, x = 1ll * x * x % p)
        if (k & 1) res = 1ll * res * x % p;
    return res % p;
}

int main() {
    scanf("%d %d %d", &n, &k, &p);
    fac[0] = ifc[0] = ifc[1] = 1;
    for (int i = 1; i <= n; ++i) fac[i] = 1ll * fac[i - 1] * i % p;
    for (int i = 2; i <= n; ++i) ifc[i] = 1ll * (p - p / i) * ifc[p % i] % p;
    for (int i = 1; i <= n; ++i) ifc[i] = 1ll * ifc[i - 1] * ifc[i] % p;
    printf("%lld\n", 1ll * C(n - 1, k - 1) * power(k, n - k - 1) % p * power(n - k, k - 1) % p);
    return 0;
}

「雅礼集训2017」共

原文:https://www.cnblogs.com/zsbzsb/p/13096306.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!