ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[SOJ477]【SPC #2】白日梦 ~ Daydream【组合数学】

2019-10-15 21:02:24  阅读:187  来源: 互联网

标签:ch 个点 Daydream SOJ477 leq SPC int read include


娃娃机毒瘤 qwq

题意简述:求所有\(n\)个点的有标号有根树的子树大小乘积的\(k\)次方和,对\(p\)取模。\(n\leq 5000, k\leq p\leq 10^9\)。


看上去吓人实际上不算难的计数题……

设\(f_i\)表示\(i\)个点的有标号有根树的答案,\(g_i\)表示\(i\)个点的有标号有根森林的答案,考虑转移。

对于\(f_i\),根节点有\(i\)种选择方案,每种方案会产生\(i^k\cdot g_{i-1}\)的贡献。

对于\(g_i\),考虑枚举\(i\)号点所在子树大小\(j\in[1, n]\),其中根节点有\(j\)种选择方案,每种方案中,\(i\)点一定在这棵树中,其余\(j-1\)个点从\(i-1\)个点中自由选择,这\(j\)个点组合成一棵树会产生\(f_j\)的贡献。

因此暴力\(O(n^2)\)dp即可,毒瘤娃娃机写了三模数\(\operatorname{fft}\)……

#include <cstdio>
#include <cctype>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#define R register
#define ll long long
using namespace std;
const int N = 5100;

int n, k, mod;
ll f[N], g[N], fac[N], comb[N][N];

template <class T> inline void read(T &x) {
    x = 0;
    char ch = getchar(), w = 0;
    while (!isdigit(ch)) w = (ch == '-'), ch = getchar();
    while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    x = w ? -x : x;
    return;
}

inline ll quickpow(ll base, ll pw) {
    ll ret = 1;
    while (pw) {
        if (pw & 1) ret = ret * base % mod;
        base = base * base % mod, pw >>= 1;
    }
    return ret;
}

int main() {
    read(n), read(k), read(mod);
    f[0] = g[0] = fac[0] = comb[0][0] = 1;
    for (R int i = 1; i <= n; ++i) {
        fac[i] = fac[i - 1] * i % mod, comb[i][0] = 1;
        for (R int j = 1; j <= i; ++j)
            comb[i][j] = (comb[i - 1][j - 1] + comb[i - 1][j]) % mod;
    }
    for (R int i = 1; i <= n; ++i) {
        f[i] = g[i - 1] * i % mod * quickpow(i, k) % mod;
        for (R int j = 1; j <= i; ++j)
            g[i] = (g[i] + f[j] % mod * comb[i - 1][j - 1] % mod * g[i - j]) % mod;
    }
    for (R int i = 1; i <= n; ++i)
        printf("%lld ", f[i]);
    return 0;
}

标签:ch,个点,Daydream,SOJ477,leq,SPC,int,read,include
来源: https://www.cnblogs.com/suwakow/p/11680742.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有