题目描述

给定一个完全图,保证\(w_{u,v}=w_{v,u}\)且\(w_{u,u}=0\),等概率选取一个随机生成树,对于每一对\((u,v)\),求\(dis(u,v)\)的期望值对\(998244353\)取模。

输入

第一行一个数\(n\)

接下来\(n\)行,每行\(n\)个整数,第\(i\)行第\(j\)个整数表示\(w_{i,j}\)

输出

输出共\(n\)行,每行\(n\)个整数,第\(i\)行第\(j\)个整数表示\(dis(i,j)\)的期望值

样例

样例输入

  1. 4
  2. 0 1 1 1
  3. 1 0 1 1
  4. 1 1 0 1
  5. 1 1 1 0

样例输出

  1. 0 374341634 374341634 374341634
  2. 374341634 0 374341634 374341634
  3. 374341634 374341634 0 374341634
  4. 374341634 374341634 374341634 0

数据范围

\(\left|w_{i,j}\right| \leq 10^9\)

\(n \leq 1000\)

题解

这是一道神奇的概率题……

其实题目原来是有一个\(20%\)的数据点,此时\(n\leq 9\),显然我们可以用\(prufer\)编码枚举生成树,然后暴力算答案即可(\(QwQ\)卡常拿了\(15pts\)走人)。但是显然\(1000\)是不可能的……

于是我们考虑这道题的特殊性质——这是一个完全图!完全图拥有非常好的对称性!

根据上面这点,对于点对\((u,v)\),任意的一条边\((x,y)\)出现在\(u\)到\(v\)的路径上的概率是一样的,同理,任意一条边\((u,x)\)或\((x,v)\)出现在\(u\)到\(v\)的路径上的概率也是一样的。于是我们发现可以把边分成三类。

  1. \((u,v)\),即两端点都在路径上
  2. \((u,x)\)或\((x,v)\),即有一个端点在路径上
  3. \((x,y)\),即两端点都不在路径上

对于第一种,只要这条边出现在生成树中就一定会经过,于是就是某一条边出现在生成树中的概率。生成树有\(n^{n-2}\)种,每种会给\((n-1)\)条边带来\(1\)贡献,显然每条边的总贡献是相同的,于是单条边的贡献为\(\frac{n^{n-2}\cdot(n-1)}{\frac{n\cdot(n-1)}{2}}=2\cdot n^{n-3}\)

然后只需再除以总方案数\(n^{n-2}\)就是概率,即\(\frac{2}{n}\)

考虑第二种,显然对于所有的\((u,x)\)概率都相等……可以发现,如果\((u,v)\)存在生成树中,一定不会选到\((u,x)\),否则就等概率地选中\((u,x)\)。那么答案为\(\frac{1-\frac{2}{n}}{n-2}\)

第三种不容易看出什么特征了,我们暴力一点求。假设把这条边切断,发现左右分成两部分,我们可以枚举其中\(x\)部分的大小,设为\(i\),则\(y\)部分为\(n-i\),其中有\(4\)个点已经确定了——\(x,y,u,v\),为了方便,我们固定\(u\)在\(x\)这边,而\(v\)在\(y\)这边,最后答案乘\(2\)即可(交换\(u,v\))。显然,答案需要乘上\(C_{n-4}^{i-2}\),\(n-4\)是因为除去这四个点,\(i-2\)是除去\(x\)和\(u\)。然后左右两边的任意一个无根树形态都是可以的,根据\(prufer\)编码,答案就是: $$\sum_{i=2}^{n-2}{\cfrac{2\cdot i{i-2}\cdot(n-i){n-i-2}\cdot C{n-4}_{i-2}}{n{n-2}}}$$直接\(O(n\log n)\)求就好了

然后统计答案,注意各种小细节,这道题就\(A\)掉辣!

\(Code:\)

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 1005
  7. #define mod 998244353
  8. int n, dis[N][N], nei[N], all;
  9. int fir, sec, thi;
  10. int fac[N], inv[N];
  11. int ksm(int a, int k)
  12. {
  13. if (!k)
  14. return 1;
  15. int p = ksm(a, k / 2);
  16. if (k & 1)
  17. return 1ll * a * p % mod * p % mod;
  18. return 1ll * p * p % mod;
  19. }
  20. int div(int a){return ksm(a, mod - 2);}
  21. int tree(int a)
  22. {
  23. if (a == 1)
  24. return 1;
  25. return ksm(a, a - 2);
  26. }
  27. int C(int n, int m)
  28. {
  29. return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod;
  30. }
  31. int main()
  32. {
  33. fac[0] = 1;
  34. for (int i = 1; i <= N - 5; i++)
  35. fac[i] = 1ll * fac[i - 1] * i % mod;
  36. inv[N - 5] = ksm(fac[N - 5], mod - 2);
  37. for (int i = N - 5; i >= 1; i--)
  38. inv[i - 1] = 1ll * inv[i] * i % mod;
  39. scanf("%d", &n);
  40. for (int i = 1; i <= n; i++)
  41. for (int j = 1; j <= n; j++)
  42. {
  43. scanf("%d", &dis[i][j]);
  44. if (i < j)
  45. all = (all + dis[i][j]) % mod;
  46. nei[i] = (nei[i] + dis[i][j]) % mod;
  47. }
  48. fir = 2 * div(n) % mod;
  49. sec = 1ll * (1 - fir) * div(n - 2) % mod;
  50. if (sec < 0)
  51. sec += mod;
  52. for (int i = 1; i < n - 2; i++)
  53. {
  54. int j = n - 2 - i;
  55. thi = (thi + 2ll * tree(i + 1) * tree(j + 1) % mod * C(n - 4, i - 1) % mod) % mod;
  56. }
  57. thi = 1ll * thi * div(tree(n)) % mod;
  58. for (int i = 1; i <= n; i++)
  59. for (int j = 1; j <= n; j++)
  60. {
  61. int ans = 1ll * dis[i][j] * fir % mod;
  62. ans = (ans + 1ll * ((nei[i] + nei[j]) % mod - dis[i][j] * 2) % mod * sec % mod) % mod;
  63. ans = (ans + 1ll * (all - ((nei[i] + nei[j]) % mod - dis[i][j]) % mod) * thi % mod) % mod;
  64. if (ans < 0)
  65. ans += mod;
  66. if (i == j)
  67. ans = 0;
  68. printf("%d%c", ans, j == n ? 10 : 32);
  69. }
  70. }

「模拟赛20180406」膜树 prufer编码+概率的更多相关文章

  1. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  2. 「模拟赛20180307」三元组 exclaim 枚举+树状数组

    题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...

  3. 「模拟赛20191019」C 推式子+贪心+树状数组

    题目描述 给定一棵\(n\)个点的有根树,根节点编号为\(1\),点有点权. 定义\(d(v)\)表示\(v\)到\(1\)的路径上的边数. 定义\(f(v,u)\)在\(v<u\)且\(v\) ...

  4. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

  5. 「模拟赛 2018-11-02」T3 老大 解题报告

    老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图),由于新建的办公室太大以 ...

  6. 「模拟赛20181025」御风剑术 博弈论+DP简单优化

    题目描述 Yasuo 和Riven对一排\(n\)个假人开始练习.斩杀第\(i\)个假人会得到\(c_i\)个精粹.双方轮流出招,他们在练习中互相学习,所以他们的剑术越来越强.基于对方上一次斩杀的假人 ...

  7. 「模拟赛20191019」B 容斥原理+DP计数

    题目描述 将\(n\times n\)的网格黑白染色,使得不存在任意一行.任意一列.任意一条大对角线的所有格子同色,求方案数对\(998244353\)取模的结果. 输入 一行一个整数\(n\). 输 ...

  8. 「模拟赛20191019」A 简单DP

    题目描述 给一个\(n\times m\)的网格,每个格子上有一个小写字母. 对于所有从左上角\((1,1)\)到右下角\((n,m)\)只向下或向右走的路径构成的集合,判断是否存在两条走法不同的路径 ...

  9. 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...

随机推荐

  1. 多媒体基础知识之YUV数据

    1.什么是YUV格式 YUV,是一种颜色编码方法.Y表示明亮度(Luminance.Luma),也就是灰度值.U和V则是色度.浓度(Chrominance.Chroma),作用是描述影像色彩及饱和度, ...

  2. 我的第一个Socket程序-SuperSocket使用入门(一)

    第一次使用Socket,遇到过坑,也涨过姿势,网上关于SuperSocket的教程基本都停留在官方给的简单demo上,实际使用还是会碰到一些问题,所以准备写两篇博客,分别来介绍SuperSocket以 ...

  3. 对数组名取地址 a[ ],&a

    C语言规定,数组名代表数组的首地址,也就是第0号元素的地址.所以a==&a[0] 但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的 ...

  4. js闭包(二)

    一.何谓“闭包”? 所谓“闭包(Closure)”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 描述的如此学术的官方解释,相信很少人能够 ...

  5. ROS探索总结(一)——ROS简介

    转自古-月 ROS探索总结(一)——ROS简介 一.历史 随着机器人领域的快速发展和复杂化,代码的复用性和模块化的需求原来越强烈,而已有的开源机器人系统又不能很好的适应需求.2010年Willow G ...

  6. go语言linux下安装

    1.从http://golang.org/dl/下载最新版本的GO语言二进制档案包. 注意:根据操作系统和计算架构正确选择档案包 2.使用tar命令将档案包解压到/usr/local目录中.具体方法如 ...

  7. vue 滚动加载数据

    参考链接:https://www.npmjs.com/package/vue-infinite-scroll

  8. 线程池的原理以及实现线程池的类ExecutorService中方法的使用

    1.线程池:线程池就是就像一个容器,而这个容器就是用来存放线程的,且有固定的容量. 如果没有线程池,当需要一个线程来执行任务时就需要创建一个线程,我们设创建线程的时间为t1,执行线程的时间为t2,销毁 ...

  9. 一个小错误,在for循环中,每次repaint()的时候,记得先把frame涂成白色的。等于擦掉原来的痕迹·。

    import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Animate { int x=1; in ...

  10. jQuery的事件处理方法

    .on()方法用来处理事件 $("li").on("click",function(){ $(this).addClass("complete&quo ...