尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Atcoder [ABC160F] Distributing Integers 题解 [ 蓝 ] [ 有向树拓扑序计数 ] [ 换根 DP ]
📅 发布时间:2026/6/19 0:03:12

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;
}

相关新闻

  • 2025年11月苏州医疗纠纷律师推荐周旭昊医学法学融合示范
  • 2025年11月四川护栏厂家推荐榜:五强对比评测与选购全攻略
  • 2025年塑料托盘品牌综合实力排行榜前十强揭晓

最新新闻

  • 2026年湖北百合种植基地推荐排行榜:百合技术/百合回收/百合种苗案例参考 - 新闻快传
  • 告别龟速与超时:全方位解决 git clone 网络难题的实战指南
  • 嵌入式MCU电气特性与FLASH操作深度解析:从数据手册到稳定设计
  • 2026 郑州八大装修公司综合实力排行榜 - GrowthUME
  • 爱回收到店估价和到手价差多少?iPhone 15 Pro实测报告 - 新闻快传
  • 2026沈阳非急救转运救护车TOP5盘点|辽中同城、浑河跨桥、棋盘山山地、院区转诊首选康跃转运 - 吉修匠

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号