参考来自这里:

https://blog.csdn.net/qq_41286356/article/details/94554729

题目在这里

https://ac.nowcoder.com/acm/contest/375/C

这题真的好,算是排列组合+树形DP的结合 吧

这题换个问法就是 :   给树节点标号,使得所有节点的父节点都比子节点大,这样的编号方法有几种?

第一次扫描,计算一个根:

第二次扫描,推进算出所有根

妙啊!

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdio>
#define maxn 100010
using namespace std;
typedef long long ll;
const ll mod = 998244353;
vector<int>G[maxn];
void insert(int be, int en) {
G[be].push_back(en);
} ll inv(ll a) {
ll n = mod - 2;
ll res = 1;
while (n) {
if (n & 1) {
res = (res*a) % mod;
}
n >>= 1;
a = (a*a) % mod;
}
return res;
} ll dp[maxn];
ll in[maxn];
ll C(int n, int m) {
ll ans = (in[n] * inv(in[m])) % mod;
ans = (ans * inv(in[n - m])) % mod;
return ans;
} ll son[maxn];
int n; int dfs(int x,int fa) {
dp[x] = son[x] = 1; for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i];
if (p == fa) continue;
dfs(p, x);
son[x] += son[p];
}
ll cnt = 0;
for (int i = 0; i < G[x].size(); i++) {
int p = G[x][i];
if (p == fa) continue;
ll a = son[x] - 1 - cnt;
ll b = son[p];
dp[x] = (((dp[x] * C(a, b)) % mod)*dp[p]) % mod;
cnt += son[p];
}
return 0;
} int dfs1(int x, int fa) {
for(int i = 0; i < G[x].size(); i++) {
int p = G[x][i];
if (p == fa) continue;
ll tmp = ((dp[x] * inv(dp[p])) % mod)*inv(C(n - 1, son[p])) % mod;
dp[p] = (((dp[p] * C(n - 1, n - son[p])) % mod)*tmp )% mod;
dfs1(p, x);
}
return 0;
} int main() { int be, en;
in[0] = 1;
for (int i = 1; i <= 1e5+4; i++) {
in[i] = (in[i - 1] * i) % mod;
} scanf("%d", &n); for (int i = 1; i < n; i++) {
scanf("%d%d", &be, &en);
insert(be, en);
insert(en, be);
}
dfs(1, -1);
dfs1(1, -1);
ll ans = 0;
for (int i = 1; i <= n; i++) {
ans = (ans + dp[i]) % mod;
}
printf("%lld\n", ans);
return 0;
}

  

换根DP(二次扫描)的更多相关文章

  1. POJ 3585 Accumulation Degree【换根DP】

    传送门:http://poj.org/problem?id=3585 题意:给定一张无根图,给定每条边的容量,随便取一点使得从这个点出发作为源点,发出的流量最大,并且输出这个最大的流量. 思路:最近开 ...

  2. [算法学习] 换根dp

    换根dp 一般来说,我们做题的树都是默认 \(1\) 为根的.但是有些题目需要计算以每个节点为根时的内容. 朴素的暴力:以每个点 \(u\) 作为 \(root\) 暴力dfs下去,复杂度\(O(n^ ...

  3. 模拟赛:树和森林(lct.cpp) (树形DP,换根DP好题)

    题面 题解 先解决第一个子问题吧,它才是难点 Subtask_1 我们可以先用一个简单的树形DP处理出每棵树内部的dis和,记为dp0[i], 然后再用一个换根的树形DP处理出每棵树内点 i 到树内每 ...

  4. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  5. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  6. 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市

    P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...

  7. 小奇的仓库:换根dp

    一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一 ...

  8. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  9. Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)

    题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次 ...

  10. bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp

    题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...

随机推荐

  1. 【Leetcode链表】环形链表 II(142)

    题目 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos ...

  2. 2016年中国的SaaS服务商企业研究

    近年来,随着中国人口红利的消退及移动互联网红利的凸显,让中国的To C创业,尤其是O2O领域的创业经历了一波高潮.2015年末,一场"资本寒冬"让O2O创业趋于理性,但SaaS及T ...

  3. hdu 6197 2017 ACM/ICPC Asia Regional Shenyang Online array array array【最长不上升子序列和最长不下降子序列】

    hdu 6197 题意:给定一个数组,问删掉k个字符后数组是否能不减或者不增,满足要求则是magic array,否则不是. 题解:队友想的思路,感觉非常棒!既然删掉k个后不增或者不减,那么就先求数组 ...

  4. 卸载ROS命令

    ROS有问题需要卸载只需输入以下命令: sudo apt-get purge ros-* sudo rm -rf /etc/ros

  5. OO第四单元博客作业

    OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十 ...

  6. mysql 优化 1

    一. 数据库索引 规则8:业务需要的相关索引是根据实际的设计所构造sql语句的where条件确定的,业务不需要的不要建索引,不允许在联合索引(或主键)中存在多余的字段,特别是该字段根本不会在条件语句中 ...

  7. 独家 | TensorFlow 2.0将把Eager Execution变为默认执行模式,你该转向动态计算图了

    机器之心报道 作者:邱陆陆 8 月中旬,谷歌大脑成员 Martin Wicke 在一封公开邮件中宣布,新版本开源框架——TensorFlow 2.0 预览版将在年底之前正式发布.今日,在上海谷歌开发者 ...

  8. JS精度问题,解决方案 math.js

    JS精度问题    Vue中使用 解决方案 math.js npm install mathjs import { create, all } from 'mathjs' const config = ...

  9. JS 复制文本兼容移动端 iOS & android

    有几个需要注意的地方. 首先文本只有选中才可以复制,所以简单的做法就是创建一个隐藏的 input,然后绑定需要复制的文本. 另外如果将 input 设置为 `type="hidden&quo ...

  10. JS中数组声明

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...