Description

题面

题目大意:求从根节点出发,每次随机走一个相邻的点,问走到任意一个叶子节点经过的路径长度的期望(走到就停止)

Solution

树上高斯消元,复杂度是 \(O(n)\) 的

设 \(f[x]\) 表示从 \(x\) 走到任意一个叶子节点路径长度的期望

首先列出转移方程: \(f[x]=\frac{f[fa]+dis(x,fa)+\sum f[son]+dis(x,son)}{in[x]}\)

对于叶子节点 \(f[x]=0\)

对于叶子的父亲只有 \(f[x]\) 和 \(f[fa]\) 两个未知项,我们可以直接把 \(f[x]\) 代入到父亲的方程中

从而使得父亲的方程也只有两个未知数,一直推到根节点,而根节点没有父亲,直接拿常数项除以系数就是答案

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,mod=1e9+7;
int head[N],nxt[N<<1],to[N<<1],num=0,n,b[N],fa[N],q[N],DFN=0,k[N],in[N];
inline void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
inline int qm(int x,int k){
int sum=1;
while(k){
if(k&1)sum=1ll*sum*x%mod;
x=1ll*x*x%mod;k>>=1;
}
return sum;
}
inline int inv(int x){return qm(x,mod-2);}
inline void dfs(int x,int last){
q[++DFN]=x;
for(int i=head[x];i;i=nxt[i])
if(to[i]!=last)fa[to[i]]=x,dfs(to[i],x);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int x,y,z;
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d%d",&x,&y,&z);x++;y++;
link(x,y);link(y,x);k[x]++;k[y]++;
b[x]+=z;b[y]+=z;
}
for(int i=1;i<=n;i++)in[i]=k[i];
dfs(1,1);
for(int i=n;i>=1;i--){
int x=q[i];
if(in[x]==1)continue;
k[fa[x]]=(k[fa[x]]-inv(k[x]))%mod;
b[fa[x]]=(b[fa[x]]+1ll*inv(k[x])*b[x])%mod;
}
b[1]=1ll*b[1]*inv(k[1])%mod;
if(b[1]<0)b[1]+=mod;
printf("%d\n",b[1]);
return 0;
}

Codeforces 802L Send the Fool Further! (hard)的更多相关文章

  1. 【树形DP】codeforces K. Send the Fool Further! (medium)

    http://codeforces.com/contest/802/problem/K [题意] 给定一棵树,Heidi从根结点0出发沿着边走,每个结点最多经过k次,求这棵树的最大花费是多少(同一条边 ...

  2. 【CF802L】Send the Fool Further! (hard) 高斯消元

    [CF802L]Send the Fool Further! (hard) 题意:给你一棵n个节点的树,每条边有长度,从1号点开始,每次随机选择一个相邻的点走,走到一个叶子时就停止,问期望走的总路程. ...

  3. Codeforces 1239A. Ivan the Fool and the Probability Theory

    传送门 注意到连续两个格子如果有相同颜色那么一路过去的都可以确定 比如一开始染了这两个位置: 然后发现后面整片过去都可以确定: 对于横着的情况也是一样,然后就会发现不可能出现横着两个和竖着两个同时都有 ...

  4. Codeforces 1255E Send Boxes to Alice(前缀和+枚举+数论)

    我们考虑前缀和sum[i],如果将a[i+1]中的一个塞入a[i]中,则不影响sum[i+1],但是sum[i]++,如果将a[i]中的一个塞入a[i+1],则不影响sum[i+1],但是sum[i] ...

  5. Codeforces 1248C Ivan the Fool and the Probability Theory(推公式)

    题意 一个n*m的网格图,每个格子可以染黑色.白色,问你每个格子最多有一个相邻颜色相同的方案数 n,m<=1e5 思路 我们先处理\(1 \times m\)的情况 设\(f[i][j]\)为前 ...

  6. [PKUWC 2018]随机游走

    Description 题库链接 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次询问给定一个集合 \(S\) ...

  7. Codeforces 802 补题

    codeforces802 A-O Helvetic Coding Contest 2017 online mirror A  Heidi and Library (easy) 水题 同B #incl ...

  8. Helvetic Coding Contest 2017 online mirror (teams allowed, unrated)

    G. Fake News (easy) time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. Helvetic Coding Contest 2017 online mirror (teams allowed, unrated) J

    Description Heidi's friend Jenny is asking Heidi to deliver an important letter to one of their comm ...

随机推荐

  1. 网络1711-1712班 c 语言评分总表一览

    学号 姓名 作业地址 PTA实验作业5分 PTA排名2分 阅读代码2分 总结1分 代码规范扣分-2--0 总分 是否推荐博客 1 **莹 http://www.cnblogs.com/wwwwxy12 ...

  2. C语言博客作业—一二维数组

    一.PTA实验作业 题目1:7-2 求整数序列中出现次数最多的数 1. 本题PTA提交列表 2. 设计思路 Begin 输入整数个数N 定义数组a[N] 输入数组a for(i 0 to N-1){/ ...

  3. 105&250-高级软件工程2017第3次作业

    小组成员 2017282110250 王婷婷 2017202110105 张芷祎 github地址 https://github.com/setezzy/Calculator_GUI PSP PSP2 ...

  4. 20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计

    20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 ...

  5. 1013团队Beta冲刺日志集合帖

    Beta预备 Beta冲刺day1 Beta冲刺day2 Beta冲刺day3 Beta冲刺day4 Beta冲刺day5 Beta冲刺day6 Beta冲刺day7 用户使用调查报告 Beta冲刺总 ...

  6. 2018上C语言程序设计(高级)作业- 第2次作业

    作业要求一 提交截图: 6-7: 6-8: 6-9: 7-1: 作业要求二 题目6-7删除字符中数字字符 1.设计思路: (1)第一步:本题要求是删除字符中的数字字符,我的主要思路是通过数组遍历若遇到 ...

  7. 在Eclipse中调用Algs4库

    首先下载Eclipse,我选择的是Eclipse IDE for Java Developers64位版本,下载下来之后解压缩到喜欢的位置然后双击Eclipse.exe启动 然后开始新建项目,File ...

  8. C实现单链表

    typedef int DataType; typedef struct ListNode { DataType data; struct ListNode* next; }ListNode; //初 ...

  9. hp MSA50 5盘RAID5重建为4盘RAID5怎么恢复数据

    [用户单位] XX省电视台[数据恢复故障描述] 一台HP 服务器,挂接一台HP MSA50磁盘阵列,内接5块1TB硬盘,原先结构为RAID5. 使用一段时间后,其中一块硬盘掉线,因RAID5支持一块硬 ...

  10. 在windows环境下安装redis和phpredis的扩展

    在windows环境下安装redis和phpredis的扩展 1.首先配置php: 需要在windows的集成环境中找到php的扩展文件夹,ext,然后在网上寻找自己的php对应的.dll文件 比如说 ...