首页 > 其他分享 >P8329 [ZJOI2022] 树

P8329 [ZJOI2022] 树

时间:2024-02-21 19:33:49浏览次数:30  
标签:结点 P8329 int 一棵树 times 叶子 ZJOI2022 gets

直接求是困难的,所以考虑容斥将所求容斥为两部分:每个结点至少在一棵树上为叶子的方案数 - 至少有一个结点在两棵树上都为叶子的方案数。

考虑 DP,设 \(f_i(x, y)\) 表示 \([1, i]\) 中是第一棵树的非叶子的结点数为 \(x\),\([i + 1, n]\) 中是第二棵树的非叶子的结点数为 \(y\) 时的方案数。

每次新增一个点,分讨转移:

  • \(i\) 在第一棵树上是非叶子,在第二棵树上是叶子:

\[f_i(x, y) \gets f_i(x, y) + f_{i-1}(x-1, y) \times (x-1)y \]

  • \(i\) 在第一棵树上是叶子,在第二棵树上是非叶子:

\[f_i(x, y) \gets f_i(x, y) + f_{i-1}(x, y+1) \times xy \]

  • \(i\) 在两棵树上都是叶子:

    这里其实还有两种情况:

    • \(i\) 在第一棵树上是叶子,钦定它在第二棵树上是叶子。
    • \(i\) 在第二棵树上是叶子,钦定它在第一棵树上是叶子。

    但因为结果相同,所以把两种情况并在一起转移,即

\[f_i(x, y) \gets f_{i-1}(x, y) \times (-2xy) \]

初值:\(\forall y \in [1, n - 1], f_1(1, y) = y\)。

答案:\(ans_n = \sum\limits_{i=1}^{n-2} f_{n-1}(x, 1) \times x\)。

时间复杂度 \(\mathcal O(n^3)\)。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

constexpr int N = 510;

int n, MOD;
ll pf[N][N], cf[N][N];

int main() {
    ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
    cin >> n >> MOD;
    for (int i = 1; i < n; i++) pf[1][i] = i;
    for (int i = 2; i <= n; i++) {
        ll ans = 0;
        for (int x = 1; x < i; x++) ans += pf[x][1] * x;
        cout << (ans % MOD + MOD) % MOD << '\n';
        for (int x = 1; x <= i; x++) {
            for (int y = 1; x + y <= n; y++) {
                cf[x][y] = (pf[x - 1][y] * (x - 1) * y + pf[x][y + 1] * x * y - ((pf[x][y] * x * y) << 1)) % MOD;
            }
        }
        memcpy(pf, cf, sizeof(pf));
    }
    return 0;
}

标签:结点,P8329,int,一棵树,times,叶子,ZJOI2022,gets
From: https://www.cnblogs.com/chy12321/p/18026056

相关文章

  • P8330 [ZJOI2022] 众数 题解
    Description给定一个长度为\(n\)的序列\(a_1,a_2,\dots,a_n\),问选一段区间,它的价值是里面的众数个数\(+\)外面的众数个数,求最大价值,以及所有满足这个最大价值的区间的外面的众数颜色。\(\sumn\leq5\times10^5,n\leq2\times10^5\)。Solution考虑根号分治。定义一个......
  • [ZJOI2022] 深搜 题解
    题目描述九条可怜是一个喜欢算法的女孩子,在众多算法中她尤其喜欢深度优先搜索(DFS)。有一天,可怜得到了一棵有根树,树根为\(\mathit{root}\),树上每个节点\(x\)有一个权值\(a_x\)。在一棵树上从\(x\)出发,寻找\(y\)节点,如果使用深度优先搜索,则可描述为以下演算过程:将递归栈......
  • [ZJOI2022] 树
    题目描述九条可怜是一个喜欢树的女孩子,她想生成两棵均有\(n\)个节点的树。第一棵树的生成方式是:节点\(1\)作为树的根。对于\(i\in[2,n]\),从\([1,i-1]\)......
  • 「ZJOI2022」众数
    「ZJOI2022」众数好难。题意:给定序列\(a\),选择一个连续子序列使得子序列内众数与剩下部分众数出现次数和最大,求出现次数和的最大值并给出剩下部分众数的可能情况。看到......
  • ZJOI2022 深搜
    链接:https://www.luogu.com.cn/problem/P8334题解:最小值期望显然可以转化为\(>=x\)的概率求和,所以我们可以考虑一个暴力,每次将\(>=x\)的点加入称为黑点,然后进行\(dp\)。那......