当前位置: 首页 > news >正文

Atcoder [ABC160F] Distributing Integers 题解 [ 蓝 ] [ 有向树拓扑序计数 ] [ 换根 DP ]

Distributing Integers

一个经典结论 + 换根 DP 的题。

结论 \(1\):对于任意一颗有向树,无论是内向还是外向的,其拓扑序个数都是 \(\dfrac{n!}{\prod_{i = 1}^{n}size_i}\)

结论 \(\bm 1\) 证明:

这里以内向树为例(外向树也是同理),考虑计数转概率,设拓扑序合法的概率为 \(P\),则拓扑序总方案数为 \(P\times n!\)

对每个节点的限制分别考虑,对于一个节点 \(u\),其限制就是子树内的所有节点的拓扑序都在 \(\bm u\) 的拓扑序前。因此这一条限制的合法概率为 \(\dfrac{(size_u - 1)!}{size_u!} = \dfrac{1}{size_u}\)

显然每一条限制是互相独立的,于是将他们相乘即可得到概率 \(P = \dfrac{1}{\prod_{i = 1}^{n}size_i}\)。因此总方案数为 \(\dfrac{n!}{\prod_{i = 1}^{n}size_i}\)

这启示我们可以从子树大小的角度求解问题。剩下的就很显然了,我们先做一遍普通树形 DP 求解以 \(1\) 为根的结果,然后注意到根节点从 \(u\) 移动到 \(v\)子树大小受到影响的只有 \(\bm{u, v}\) 两个点,于是考虑换根 DP,转移的时候将他们的贡献去掉,重新算一遍即可。

使用线性预处理逆元,即可做到时间复杂度 \(O(n)\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
#define lc(x) (tr[x].ls)
#define rc(x) (tr[x].rs)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi = pair<int, int>;
const int N = 200005;
const ll mod = 1e9 + 7;
vector<int> g[N];
int n;
ll inv[N], prod = 1, sz[N], dp[N];
void init()
{inv[1] = 1;for(int i = 2; i < N; i++)inv[i] = (mod - mod / i) * inv[mod % i] % mod;
}
void dfs1(int u, int fa)
{sz[u] = 1;for(auto v : g[u]){if(v == fa) continue;dfs1(v, u);sz[u] += sz[v];}prod = (prod * inv[sz[u]]) % mod;
}
void dfs2(int u, int fa)
{for(auto v : g[u]){if(v == fa) continue;dp[v] = (dp[u] * sz[v] % mod * inv[n - sz[v]]) % mod;dfs2(v, u);}
}
int main()
{//freopen("sample.in", "r", stdin);//freopen("sample.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);init();cin >> n;for(int i = 1; i <= n; i++) prod = (prod * i) % mod;for(int i = 1; i < n; i++){int u, v;cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}    dfs1(1, 0);dp[1] = prod;dfs2(1, 0);for(int i = 1; i <= n; i++) cout << dp[i] << "\n";return 0;
}
http://www.jsqmd.com/news/35530/

相关文章:

  • 2025年优秀的网站建设顶尖推荐榜
  • [Linux框架编程——Lesson11.进程控制:等待]
  • 2025年可靠的网站建设网站体验排行榜
  • 2025年正规的短视频拍摄热门选择排行榜
  • 2025年11月苏州医疗纠纷律师推荐周旭昊医学法学融合示范
  • 2025年11月亚克力板材厂家排行榜:五强性能对比与权威评测
  • 2025年11月亚克力板材厂家对比榜:全国主流厂商数据化排行解析
  • 2025年11月四川护栏厂家推荐榜:五强对比评测与选购全攻略
  • 2025年塑胶卡板品牌综合评测:孚瑞塑胶卡板领跑行业十大供应商
  • 2025年塑料托盘品牌综合实力排行榜前十强揭晓
  • 2025年值得信赖的装修最新热门推荐榜
  • 2025年枫叶租车融资权威深度解析:聚焦消费分级,双引擎开拓中高端租车新路径
  • 2025年专业的格力空调代理专业团队推荐榜
  • 2025年11月四川护栏厂家评测榜:五强生产交付能力全景排行
  • 2025年11月股权融资律师推荐指南专业视角
  • 2025年11月纯粮白酒品牌推荐榜:久久领衔全香型对比评测
  • 2025年11月公司股权律师推荐榜单出炉专业视角解析
  • 2025年11月纯粮白酒品牌推荐榜:久久领衔十强口碑排行
  • 深入解析:2025年ASP.NETMVC面试题库全解析
  • AI Agent 的几个主要发展方向和细分领域
  • 2025年口碑好的储能高压直流接触器用户好评厂家排行
  • 15 个 Eloquent 高级技巧,瞬间提升你的 Laravel 应用性能
  • 2025年口碑好的北美专线国际空运认证资质齐全榜单
  • 今日八股——JVM篇 - 指南
  • 2025年比较好的赣州装修公司全包施工
  • 2025年口碑好的酒会活动策划用户满意度TOP榜单
  • 2025年质量好的企业环保咨询用户满意度TOP榜单
  • 2025年深圳婚姻纠纷律师联系电话推荐:本地口碑榜与使用须知
  • 2025年口碑好的成都标书行业精选榜
  • 2025年质量好的档案文件销毁品牌服务排行榜