题目描述

小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室(a,是任意的)他的基友卧室(b,还是任意的)。(注意,a有可能等于b。)然而小仓鼠学OI学傻了,不知道怎么怎么样才能最短的走到目的地。于是他只能随便乱走。当他在每一个节点时,等概率到这个点的母亲或者所有孩子节点(例如这个节点有一个母亲节点和两个子节点,那么下一步走到这3个节点的概率都是1/3)。一但走到了他基友的卧室,就会停下。

现在小仓鼠希望知道,他走到目的地时,走的步数的期望。这个期望本来是一个有理数,但是为了避免误差,我们要求对这个有理数取模,%998244353。

下面是“分数”模运算的定义:

b, m互质

k = a/b (mod m) <=> kb = a (mod m)

这里求 x = 1/17 (mod 2668)

<=>
17x = 1 (mod 2668)
<=>
17x = 2668k + 1 (k∈整数)
取合适的k使得17|(2668k+1) 这里刚好17 | (2668 + 1)

所以k = 1, x = (2668+1)/17 = 157

当然,当k = 1 + 17n 时,

x = (2668 + 17·n·2668 + 1)/17 = 157 + 2668n

也符合条件(n任意整数)

但如果限定 2668 > x > 0,x是唯一的。

小仓鼠那么弱,还要天天被JOHNKRAM大爷虐,请你快来救救他吧!

输入输出格式

输入格式:

第一行一个正整数n,表示这棵树节点的个数。

接下来n-1行,每行两个正整数u和v,表示节点u到节点v之间有一条边。

输出格式:

一个整数,表示取模后的答案。

输入输出样例

输入样例#1:

3
1 2
1 3

输出样例#1:

110916041

说明

对于30%的数据 n<=5;

对于50%的数据 n<=5000;

对于所有数据 n<=100000。

样例解释

期望是16/9

如果a在叶子 b在根,E1=1。有2种情况。

如果a在根,b在叶子。E2=1/2+31/4+51/8...=3。有2种情况。

如果a和b都在不同的叶子,E3=E2+1。有2种情况。

如果a=b,E4=0,有3种情况。

所以期望是16/9,有理数取模后就是输出。


题解

期望

可以考虑把每条边的贡献拆成两部分

一部分是\(f[u]\)表示从u走到ta的父亲的期望距离

另一部分是\(g[u]\)表示从u的父亲走到u的期望距离

然后就可以求出从u走到父亲的期望\(f[u] = \frac{1}{d[u]} * 1 + \frac{1}{d[u]} * \sum_{son[u]}{(1 + f_{son[u]} + f[u])}\)

然后两遍同时乘\(d[u]\)

移一下项\(f[u] = d[u] + \sum_{son[u]}{f_{son[u]}}\)

然后再求出从v的父亲u走到v的期望\(g[v] = \frac{1}{d[u]} * 1 + \frac{1}{d[u]} * (1 + g[u] + g[v]) + \frac{1}{d[u]} * \sum_{son[u]≠v}{(1 + f_{son[u]} + g[v])}\)

同时乘\(d[u]\)然后移项得\(g[v]=g[u]+\sum_{son[u]≠v}{f_{son[u]}}+d[u]\)

这样求出\(f[]\)和\(g[]\)以后再Dfs一遍统计答案

对于一个点,ta对答案的贡献是ta的子树内的每个节点全部到外面的任意一个节点去然后外面的任意一个节点到子树里的任意一个节点来的期望

即\(size[u] * (n-size[u]) * (f[u]+g[u])\)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
# define int long long
const int M = 100005 ;
const int mod = 998244353 ;
using namespace std ;
inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0'&&c<='9') { x = x*10+c-'0' ; c = getchar() ; }return x*w ;
}int n ;
int hea[M] , num ;
int d[M] , size[M] ;
int f[M] , g[M] , t[M] , Ans ;
struct E {int Nxt , to ;
} edge[M << 1] ;
inline void add_edge(int from , int to) {edge[++num].Nxt = hea[from] ;edge[num].to = to ;hea[from] = num ;
}
void exgcd(int a , int b , int &x , int &y) {if(b == 0) { x = 1 , y = 0 ; return ; }exgcd(b , a % b , x , y) ;int tmp = x ; x = y ; y = tmp - a / b * y ;
}
inline int inv(int a) {int x , y ; exgcd(a , mod , x , y) ;return (x + mod) % mod ;
}
void Dfs1(int u , int father) {f[u] = d[u] ;for(int i = hea[u] ; i ; i = edge[i].Nxt) {int v = edge[i].to ;if(v == father) continue ;Dfs1(v , u) ;f[u] += f[v] ;}
}
void Dfs2(int u , int father) {int ret = 0 ;for(int i = hea[u] ; i ; i = edge[i].Nxt) {int v = edge[i].to ;if(v == father) continue ;ret += f[v] ;}for(int i = hea[u] ; i ; i = edge[i].Nxt) {int v = edge[i].to ;if(v == father) continue ;g[v] = (g[u] + ret - f[v] + d[u]) % mod ;Dfs2(v , u) ;}
}
void query(int u , int father) {size[u] = 1 ;for(int i = hea[u] ; i ; i = edge[i].Nxt) {int v = edge[i].to ;if(v == father) continue ;query(v , u) ;size[u] += size[v] ;}Ans = (Ans + size[u] * (n - size[u]) * (f[u] + g[u]) + mod) % mod ;
}
# undef int
int main() {
# define int long longn = read() ;for(int i = 1 , u , v ; i < n ; i ++) {u = read() , v = read() ;add_edge(u , v) ; add_edge(v , u) ;++d[u] ; ++d[v] ;}Dfs1(1 , 1) ; Dfs2(1 , 1) ; query(1 , 1) ;printf("%lld\n",(Ans * inv(n * n)) % mod) ;return 0 ;
}

转载于:https://www.cnblogs.com/beretty/p/10038451.html

仓鼠找sugar II相关推荐

  1. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  2. 【luogu3398】 仓鼠找sugar [LCA 倍增]

    P3398 仓鼠找sugar 长期不学竞赛...导致1mol的低级错误出现 把f数组开为f[N][20] 写错判断 我烂了QAQ我好瘟死于低级错误久久无法判断出来 如果两条路径相交,那么一定有一条路径 ...

  3. 【洛谷】【lca+结论】P3398 仓鼠找sugar

    [题目描述:] 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室 ...

  4. luogu P3398 仓鼠找sugar

    P3398 仓鼠找sugar 224通过 860提交 题目提供者 fjzzq2002 标签 云端↑ 难度 提高+/省选- 时空限制 1s / 128MB 题目描述 小仓鼠的和他的基(mei)友(zi) ...

  5. [Luogu 3398] 仓鼠找sugar

    [Luogu 3398] 仓鼠找sugar 又是 LCA- 前两天死活写不过的一个题今天终于顺手切了. 思路嘛参考了一楼题解. 就是说,对于 a, b, c, d 四个点, 令 x = LCA(a, ...

  6. P3398 仓鼠找sugar (倍增LCA)

    P3398 仓鼠找sugar (倍增LCA) 前言:本来想找 t a r j a n tarjan tarjan的题做下的,结果这个标签有 t a r j a n tarjan tarjan,却是 l ...

  7. 洛谷 P3398 仓鼠找 sugar

    仓鼠找 sugar 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为 1 1 1~ n n n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室( a a ...

  8. P3398 仓鼠找sugar(LCA,树剖)

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  9. luogu P3398 仓鼠找sugar(树链剖分、求树上两条路径有没有交点,爽!)

    整理的算法模板合集: ACM模板 舒服,一次敲160行代码一次编译通过一次AC是真的爽! 虽然这道题可以当作简单版的树链剖分板子题了hhh 要求的是两条路径有没有交点,正解是LCA玄学证明,看的我有点 ...

最新文章

  1. 二极管7种应用电路详解之七
  2. 交互式电子杂志_交互环境中电子杂志的生存发展探析
  3. 一个好用的Visual Studio Code扩展 - Live Server,适用于前端小工具开发
  4. .NET Core 3.0】框架之十三 || 部署攻略
  5. Java:从99瓶子数到0,一个int、String变量、while循环、if条件测试
  6. java getipaddress_教你java用getAddress方法取得IP地址
  7. Android 8.0 学习(21)---Oreo的画中画模式学习
  8. NET 技术FAQ(六)-----属性
  9. 小米路由器显示无法连接服务器错误代码,小米路由器:路由器无法上网怎么办...
  10. idea 破解版安装
  11. java基于springboot+vue的学生宿舍报修管理系统(源码+数据库+Lw文档)
  12. “学霸系统”之NABC
  13. 昨天面了一位,见识到了Spring的天花板~
  14. 梦幻星空html,如何使用HTML5的canvas来画一个梦幻星空,快来学习一下吧 | 龙奔网...
  15. 进制转换应用场景_【Android】单位换算软件来袭,帮你解决生活中所有的进制换算问题,让你轻松秒变大神!...
  16. php guzzlehttp,使用Guzzle执行HTTP请求
  17. ln x的matlab表示,matlab中ln怎么表示
  18. Linux signal捕获
  19. quickq官方版下载_Forex Signal
  20. MySQL分配内存多少合适_mysql 如何分配内存

热门文章

  1. 画春天的景色计算机教案,【美丽的春天图画】美丽的春天幼儿园春季教案
  2. 咸鱼Micropython—SPI
  3. 华为鸿蒙源自那句话,华为鸿蒙系统名字源自山海经它的很多自主专利都源于这本古籍,为什么?...
  4. 市场调研报告-全球与中国地球物理数据市场现状及未来发展趋势
  5. Error:A JNI error has occurred,please check your installation and try again
  6. 微机原理——8086系统的概述与引脚介绍
  7. 弘辽科技:淘宝直通车显示排查下架是什么?还能推广吗?
  8. 股票交易一点感悟和程序化交易实战
  9. Linux 挂载Samba 设置777权限及取消挂载
  10. 电脑ps计算机磨皮,用PS磨皮详解教程 -电脑资料