思路

挺神的概率期望。。

好吧是我太弱了,完全没有往那里想

注意期望是具有线性性的,一条路径的期望可以变成每条边的期望求和

概率是某件事发生的可能性,期望是某件事确定发生的代价

首先没有终点的条件并不好做,可以转化成有终点的条件

把根假设成终点,设f(x)是向父亲前进一步的期望移动次数\(f(x)=1+\sum_{v\in son[x]} \frac{1}{d[x]}f(v)\)(后面一部分是指走到子节点再走回来)

变形得到\(f(x)=d[x]+\sum_{v\in son[x]}f(v)\)(其实就是x的子树的度数和)

\(ans=\sum_{i}f[i]*sz[i]\)

此时可以按照每个点是根,O(n2)的计算一遍,因为起点终点共有n2种可能性,所以要除以n^2

接下来考虑每个f对最后ans的贡献

如果x是终点,则f(x)为0,产生1次贡献,sz为n

如果终点在x的子树v中,则f(x)=totd-sumd[v],sz为n-sz[v],产生sz[v]次贡献

如果终点不在x的子树中,则f(x)=sumd[x],sz为sz[x],产生n-sz[x]次贡献

可以脑补一下以x为分界点,把两侧的路径拼合的过程

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define int long long
const int MOD = 998244353;
int f[100100],d[100100],totd,sumd[100100],sz[100100];
int u[100100<<1],v[100100<<1],fir[100100],nxt[100100<<1],cnt,ans;
int n;
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(ans*a)%MOD;
a=(a*a)%MOD;
b>>=1;
}
return ans;
}
void addedge(int ui,int vi){
++cnt;
u[cnt]=ui;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
void dfs1(int u,int f){
sz[u]=1;
if(f)
d[u]=1;
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==f)
continue;
d[u]++;
dfs1(v[i],u);
sz[u]+=sz[v[i]];
sumd[u]+=sumd[v[i]];
}
sumd[u]+=d[u];
totd+=d[u];
}
void dfs2(int u,int f){
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==f){
ans=(ans+sumd[u]*sz[u]%MOD*(n-sz[u])%MOD)%MOD;
continue;
}
ans=(ans+(totd-sumd[v[i]])*(n-sz[v[i]])%MOD*sz[v[i]]%MOD)%MOD;
dfs2(v[i],u);
}
}
signed main(){
freopen("std.in","r",stdin);
scanf("%lld",&n);
for(int i=1;i<n;i++){
int a,b;
scanf("%lld %lld",&a,&b);
addedge(a,b);
addedge(b,a);
}
dfs1(1,0);
// printf("%lld\n",totd);
dfs2(1,0);
printf("%lld\n",ans*pow(n*n%MOD,MOD-2)%MOD);
return 0;
}

P3412 仓鼠找sugar II的更多相关文章

  1. Luogu P3412 仓鼠找$sugar$ $II$

    Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点 ...

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

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

  3. luogu P3412 仓鼠找sugar II 期望 树形dp

    LINK:仓鼠找sugar II 以前做过类似的期望题目 加上最后的树形dp不算太难 还是可以推出来的. 容易发现 当固定起点和终点的时候 可以先固定根 这样就不用分到底是正着走还是倒着走了. 1为根 ...

  4. 仓鼠找sugar II

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

  5. [luogu3412]仓鼠找sugar II

    题面在这里 题意 给定一棵树(\(n\le10^5\)),仓鼠随机选择起点和终点,之后从起点开始随机游走,每次都会等概率地选择和其相邻的任一道路,直到到达终点,求到达终点时步数的期望 sol 因为这一 ...

  6. P3398 仓鼠找sugar

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

  7. 【Luogu3398】仓鼠找sugar(树链剖分)

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

  8. 洛谷P3398 仓鼠找sugar [LCA]

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

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

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

随机推荐

  1. Marlin 溫度感應器 數值轉換對應表

    Marlin 溫度感應器 數值轉換對應表   (2014/03/27)Update: 自己實測了這個自動產生的對應表,結果測得的溫度與實際值仍有相當大的誤差.看來還是要回頭用測量的方式來校正溫度... ...

  2. keras 上添加 roc auc指标

    https://stackoverflow.com/questions/41032551/how-to-compute-receiving-operating-characteristic-roc-a ...

  3. Sitecore CMS中的项目如何配置帮助文本

    如何在Sitecore CMS中的项目上配置帮助文本. 所有Sitecore项目都有长短描述字段,以及“帮助链接”字段.这些字段有助于向内容编辑者提供其他信息.这对于很少编辑的项目和字段尤其重要,因为 ...

  4. uvalive 4960 Sensor Network

    题意: 给出一个无向图,求一个生成树使得这个生成树的最大边与最小边之差最小,输出这个最小的差值.n的最大值为350. 思路: 这题不看题解想破头也不知道怎么写Orz. 暴力的做法是可以从大到小枚举边作 ...

  5. LinkedList 底层实现原理

    LinkedList的底层实现原理 LinkedList 底层数据结构为双向链表,链表结构,基于一个个链表节点Node 1,Inner Class 内部类 private static class N ...

  6. 谈谈Groovy闭包

    A closure is a function with variables bound to a context or environment in which it executes. 概述 闭包 ...

  7. 阿里巴巴json fastjson String转javaBean

    private Entity getEntity(String resp){        JSONObject jsonObj = (JSONObject) JSON.parse(resp);    ...

  8. Eloquent JavaScript #09# Regular Expressions

    索引 Notes js创建正则表达式的两种方式 js正则匹配方式(1) 字符集合 重复匹配 分组(子表达式) js正则匹配方式(2) The Date class 匹配整个字符串 Choice pat ...

  9. Docker学习笔记之搭建Docker运行环境

    0x00 概述 既然 Docker 是一款实用软件,我们就不得不先从它的安装说起,只有让 Docker 运行在我们的计算机上,才能更方便我们对 Docker 相关知识和使用方式的学习.得益于与商业性的 ...

  10. redis 数据统计(用自增id防止同一秒并发过大没统计成功)

    Redis 缓存保存某段时间累加的数值,加入最大id防止同一秒并发过大,导致只统计了执行时同一秒的部分数据,而同一秒另一部分数据在下次累加时没有统计到缓存中 //coin总数 public funct ...