题目背景

1s 512M

题目描述

小 A 和小 B 正在玩一个游戏:有一棵包含 n=2m个点的有根树(点从1∼n 编号),它的根是 1 号点,初始时两人各拥有 m 个点。游戏的每个回合两人都需要选出一个自己拥有且之前未被选过的点,若对手的点在自己的点的子树内,则该回合自己获胜;若自己的点在对方的点的子树内,该回合自己失败;其他情况视为平局。游戏共进行 m 回合。

作为旁观者的你只想知道,在他们随机选点的情况下,第一次非平局回合出现时的回合数的期望值。

为了计算这个期望,你决定对于 k=0,1,2,⋯,m,计算出非平局回合数为 k 的情况数。两种情况不同当且仅当存在一个小 A 拥有的点 x,小 B 在 x 被小 A 选择的那个回合所选择的点不同。

由于情况总数可能很大,你只需要输出答案对 998244353 取模后的结果。

输入格式

第一行一个正整偶数 n 表示树的结点数。

第二行一个长度为 n 的 01 字符串,第 i 个字符为 00 表示 i 号点被小 A 拥有,否则被小 B 拥有。保证 0、1 的个数相同。

接下来 n-1 行每行两个正整数 u, v,表示树中的一条边。

输出格式

共2/n +1 行每行一个整数,第 i 行的整数表示k=i−1 时的答案。
补充提示:
输出格式为一行2/n +1 个数或 2/n +1行每行一个数均可

输入输出样例

输入 #1

8
10010011
1 2
1 3
2 4
2 5
5 6
3 7
3 8

输出 #1

0
10
10
4
0

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5050, P = 998244353;
int m, n, sz0[N], sz1[N], sz[N], c[N][N], A[N], B[N];
int dp[N][N];
vector <int> g[N];
int add(int a, int b){return a + b >= P ? a + b - P : a + b;
}
int sub(int a, int b) {return a < b ? a - b + P : a - b;
}
char s[N];
void dfs(int u, int pre = 0) {dp[u][0] = 1;sz[u] = 1;for (int i = 0; i < g[u].size(); ++i) {int v = g[u][i];if (v == pre) continue;dfs(v, u);vector <int> tmp(sz[u] + sz[v] + 1);for (int i = 0; i <= sz[u]; ++i)for (int j = 0; j <= sz[v]; ++j)tmp[i + j] = add(tmp[i + j], (ll)dp[u][i] * dp[v][j] % P);sz[u] += sz[v];sz0[u] += sz0[v];sz1[u] += sz1[v];for (int i = 0; i <= sz[u]; ++i) dp[u][i] = tmp[i];// 背包:不构成新的 // tmp[i + j] += dp[u][i] * dp[v][j]}if (s[u] == '0') {++sz0[u];for (int i = sz1[u] - 1; i >= 0; --i)dp[u][i+1] = add(dp[u][i+1], dp[u][i] * (ll)(sz1[u] - i) % P);} else {++sz1[u];for (int i = sz0[u] - 1; i >= 0; --i)dp[u][i+1] = add(dp[u][i+1], dp[u][i] * (ll)(sz0[u] - i) % P);}
}
void transfer(int* A, int* B, int n) {// 二项式反演 Afor (int i = 0; i <= n; ++i) {for (int d = i; d <= n; ++d) {if ((d-i) & 1) B[i] = sub(B[i], c[d][i] * (ll)A[d] % P);else B[i] = add(B[i], c[d][i] * (ll)A[d] % P);}}
}
int main() {cout << fixed;cin >> m >> (s + 1);n = m / 2;for (int i = 1; i < m; ++i) {int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}dfs(1);c[0][0] = 1; vector <int> Pw(m + 1);Pw[0] = 1; for (int i = 1; i <= m; ++i) Pw[i] = Pw[i-1] * (ll)i % P;for (int i = 1; i <= m; ++i) {c[i][0] = c[i][i] = 1;for (int j = 1; j < i; ++j) c[i][j] = add(c[i-1][j], c[i-1][j-1]);}for (int i = 0; i <= n; ++i) A[i] = (ll)dp[1][i] * Pw[n - i] % P;transfer(A, B, n);for (int i = 0; i <= n; ++i) cout << B[i] << "\n";return 0;
}

涂色游戏color(【CCF】NOI Online 能力测试2 提高组第一题 )
子序列问题sequence(【CCF】NOI Online能力测试2 提高组第二题 )

游戏match(【CCF】NOI Online能力测试2 提高组第三题 )相关推荐

  1. 建设城市(city)(【CCF】NOI Online 能力测试2 入门组第三题 )

    时间限制: 1.0 秒 空间限制: 256 MB 题目描述 球球是一位建筑师.一天,他收到市长的任务:建设城市.球球打算建造 2n 座高楼.为了保证城市美观,球球做出了如下计划: 球球喜欢整齐的事物. ...

  2. 涂色游戏color(【CCF】NOI Online 能力测试2 提高组第一题 )

    子序列问题sequence([CCF]NOI Online能力测试2 提高组第二题 ) 游戏match([CCF]NOI Online能力测试2 提高组第三题 ) 题目背景 1s 256M 题目描述 ...

  3. 子序列问题sequence(【CCF】NOI Online能力测试2 提高组第二题 )

    本题代码稍后加入 题目背景 2s 512M 题目描述 给定一个长度为 n的正整数序列 A1, A2, ⋯, An .定义一个函数 f(l,r) 表示:序列中下标在 [l,r]范围内的子区间中,不同的整 ...

  4. 优秀子序列(【CCF】NOI Online能力测试3 提高组)

    题目描述 现在请你求出 A 的所有优秀子序列的价值之和,答案对 10^9+7 取模. 输入格式 第一行一个正整数 n 表示序列长度. 第二行 n 个用空格分隔的非负整数,表示 a1​,a2​,⋯,an ...

  5. 魔法值(【CCF】NOI Online能力测试3 提高组)

    题目描述 H 国的交通由 n 座城市与 m 条道路构成,城市与道路都从 1 开始编号,其中 1 号城市是 H 国的首都.H 国中一条道路将把两个不同城市直接相连,且任意两个城市间至多有一条道路. H ...

  6. 未了(endless)(【CCF】NOI Online 能力测试2 入门组第一题 )

    时间限制: 1.0 秒 空间限制: 256 MB 题目描述 由于触犯天神,Sisyphus 将要接受惩罚. 宙斯命 Sisyphus 推一块巨石上长度为 L的山坡.Sisyphus 匀速向上推的速度为 ...

  7. 观星(【CCF】NOI Online能力测试3 入门组)

    题目描述 Jimmy 和 Symbol 约好一起看星星,浩瀚的星空可视为一个长为 N.宽为 M 的矩阵,矩阵中共有 N×M 个位置,一个位置可以用坐标 (i,j)(1≤i≤N,1≤j≤M)来表示.每个 ...

  8. 最急救助(【CCF】NOI Online能力测试3 入门组)

    题目描述 救助中心每天都要收到很多求救信号.收到求救信号后,救助中心会分析求救信号,找出最紧急的求救者给予救助. 求救信号是一个由小写英文字母组成的字符串,字符串中连续三个字符依次组成sos的情况越多 ...

  9. 买表(【CCF】NOI Online能力测试3 入门组)

    题目描述 Jimmy 到 Symbol 的手表店买手表,Jimmy 只带了 nn 种钱币,第 ii 种钱币的面额为 ki​ 元,张数为 ai​ 张.Symbol 的店里一共有 m 块手表,第 i 块手 ...

最新文章

  1. 【Python】Scrapy爬虫实战(传智播客老师简介)
  2. 常见的冒泡排序、顺序查找和对半查找
  3. Evernote用户只用了5%的功能,这着实给科技公司上了一课
  4. Java的知识点28——文件编码、IO流的实例
  5. Chrome开发者工具对Vue应用的支持
  6. 每日一笑 | IE的反射弧也太长了吧......
  7. MTK 驱动开发(3)---GPIO口的使用方法汇总
  8. native内存泄漏分析
  9. kali linux安装QQ linux版教程
  10. XAMPP下的Tomcat 7运行出现“1% 不是有效的 Win32 应用程序。”
  11. 关于大数据相关的问答汇总,持续更新中~
  12. C#删除word页眉页脚和最后一页
  13. 阿里云视频点播(VOD)控制台上传慢解决方案
  14. 区块链、NFT 与元宇宙中的稀缺性技术
  15. 算法-求数组的子数组之和的最大值
  16. mtk6595资料帖和问题帖集合
  17. 今天才发现!华为手机点击这个按钮,就能自动保存通话录音
  18. android视频图片上传,适配Android WebView支持上传图片,视频
  19. 关于在VS上创建的工程从win32改为x64时导致断点无法生效的原因与解决方法!
  20. 51单片机——基于单片机的智能报警系统设计

热门文章

  1. sqlserver 字符串中是不是全为数字
  2. Jquery实现鼠标双击Table单元格变成文本框
  3. Springboot(java)程序部署到k8s
  4. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发鼻涕下拉粘连效果
  5. Maven的依赖范围
  6. 【Java从0到架构师】Linux 应用 - 软件包管理、软件安装
  7. ab 服务器压力测试工具 使用详解
  8. 东航期货行情接口和交易接口(20190509)
  9. 手把手教你最好用的数据分析方法,会用的没几个
  10. 正确选择报表工具的十大标准