Description

“是的。”我回答,“我不会忘记你。在森林里我会一点点记起往日的世界。要记起的大概很多很多:各种人、各种场所、各种光、各种歌曲……”
——村上春树《世界尽头与冷酷仙境》

在没有心存在的世界尽头,音乐能够使小镇居民消散的心重新聚拢成形。作为镇子里唯一一个还残留着些许音乐记忆的人,我逐渐记起了往昔点滴……

记忆中有一棵无根树,有n个节点。
对于一棵有根树的每一个非叶子节点,我们都等概率选中其一个儿子节点作为偏好儿子。对于一条从父亲指向儿子的树边(u,v),如果v是u的偏好儿子,则称这条边为重边,否则为轻边。
我们定义一棵有根树的权值为其每一个节点到根路径上的轻边条数的和的期望值。
请对无根树每一个节点输出其为根的有根树的权值。答案模998244353。

Input

文件第一行是一个正整数n。
接下来n-1行,每行两个正整数(x,y)表示一条树边。

Output

输出文件共n行,每一行一个整数表示答案。

Sample Input

5
1 2
1 3
3 4
3 5

Sample Output

3
1
665496238
499122178
499122178

Data Constraint

对于10%的数据,保证n<=10。
对于30%的数据,保证n<=2000。
对于100%的数据,保证n<=10^5。

题解

这个题的实现和天天爱跑步有的一拼。 - - - - 一位大佬在赛后如此说道。
首先,我们通过思考,可以想出来O(n2)O(n^2)的做法。
dpi=∑nj=1sizej∗Pedge(on the path of i->j)dp_i=\sum_{j=1}^n size_j*P_{edge(\text{on the path of i->j})}
然后我们来思考如何优化。
我们考虑枚举每条边,计算贡献。
我们发现,一条边对一个点的贡献只有两种值,分别对应这个点在这条边的两侧。
所以,我们在用上面的方程计算出贡献之后,我们只需要分别将两边的点加上贡献即可。
我们可以发现,这两类点,一类其实就是那条边的子树内的所有点,另一类就是其他点。
所以我们只需要随便选一个点进行一遍dfs,得到所需信息,以及dfs序,就可以做了。
修改时差分地在dfs序上修改即可。
然后发现这样做都过不了样例,重新手玩样例之后,发现其实有两个点是特殊的,就是边的两个端点。
它们的值还要另外计算。
这个题其实就是不好调试。
代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#define ll long long
using namespace std;
inline int read(){int x=0;char ch=' ';int f=1;while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();if(ch=='-')f=-1,ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return x*f;
}
const int N=1e5+5;
const int p=998244353;
struct edge{int to,next;}e[N<<1];
int n,tot;
int head[N],dfn_clock,mp[N];
ll inv[N],ans[N],all,du[N],size[N];
inline void addedge(int x,int y){e[++tot].to=y;e[tot].next=head[x];head[x]=tot;}
inline ll frac(int x,int y){return (x*inv[y])%p;}
inline void getinv(){inv[0]=inv[1]=1;for(int i=2;i<=n;i++)inv[i]=((p-p/i)*inv[p%i])%p;
}
inline void dfs(int x,int fa){size[x]=1;mp[x]=++dfn_clock;for(int i=head[x];i;i=e[i].next){int u=e[i].to;if(u==fa)continue;dfs(u,x);size[x]+=size[u];}
}
inline void dfs2(int x,int fa){for(int i=head[x];i;i=e[i].next){int u=e[i].to;if(u==fa)continue;ll sizeu=size[u],dux=du[x],duu=du[u],mpx=mp[x],mpu=mp[u];ll num=(sizeu*frac(max(dux-2,0LL),dux-1))%p;all+=num;if(all>p)all%=p;ans[mpu]-=num;ans[mpu+sizeu]+=num;ans[mpx]-=num;ans[mpx+1]+=num;num=(sizeu*frac(dux-1,dux))%p;ans[mpx]+=num;ans[mpx+1]-=num;num=((n-sizeu)*frac(max(duu-2,0LL),duu-1))%p;ans[mpu]+=num;ans[mpu+sizeu]-=num;ans[mpu]-=num;ans[mpu+1]+=num;num=((n-sizeu)*frac(duu-1,duu))%p;ans[mpu]+=num;ans[mpu+1]-=num;dfs2(u,x);}
}
int main(){freopen("redemption.in","r",stdin);freopen("redemption.out","w",stdout);n=read();getinv();for(int i=1;i<n;i++){int x=read(),y=read();addedge(x,y);addedge(y,x);du[x]++;du[y]++;}dfs(1,0);dfs2(1,0);ans[0]=all;for(int i=1;i<=n;i++){ans[i]=(ans[i-1]+ans[i])%p;}for(int i=1;i<=n;i++){printf("%lld\n",(ans[mp[i]]+p)%p);}return 0;
}

【NOIP2017提高A组冲刺11.2】救赎(数学期望)相关推荐

  1. JZOJ 5444. 【NOIP2017提高A组冲刺11.2】救赎

    Description "是的."我回答,"我不会忘记你.在森林里我会一点点记起往日的世界.要记起的大概很多很多:各种人.各种场所.各种光.各种歌曲--" -- ...

  2. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  3. jzoj_5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  4. [JZOJ5459]【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

  5. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  6. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  7. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  8. JZOJ5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  9. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

  10. JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章

    Description nodgd写了一篇文章,自认为这是一篇好文章.nodgd的文章由n个小写英文字母组成.文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数.nodgd在文 ...

最新文章

  1. 【软件工程】VB版机房文档总结
  2. JavaWeb项目实现文件下载
  3. linux性能调优原创翻译系列
  4. 编程之美-数字哑谜和回文方法整理
  5. android打包apk、apk签名及360加固工具的使用
  6. 邮件联系人,如何恕不部分字母就能显示邮件联系人
  7. linux基础命令_Linux编程基础:常用命令
  8. leetcode 21 java_LeetCode 21. 合并两个有序链表
  9. 计算机 术语库 excel,Trados直接用Excel做术语库
  10. AndroidStudio一键国际化方案
  11. About The Idea Of Flipped
  12. apollo决策规划学习--慢速障碍物超车
  13. WIN10作为服务器操作系统可以吗,服务器可以装win10吗
  14. 编程猫python课程结束后哪里再学更高级别的_@正在选编程猫的家长,先别急,看完这篇测评再报也不迟!...
  15. vivo分屏_Vivo手机怎么分屏,你知道吗?不会手机就白买了。
  16. 病毒---手动删除Trojan.Miner.gbq病毒
  17. 生日快乐python编程代码_如何用C语言编写一个很炫的生日快乐的程序?
  18. python如何解析PDF文件
  19. 三星n8000Android,三星 N8000 刷机详细图文教程
  20. dhs手术是什么意思_求教DHS的适应症和手术操作规范

热门文章

  1. 花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)...
  2. python爬股指期货数据_新浪期货数据接口API(实时数据/历史数据)
  3. Pointer Network指针网络
  4. Vim Instruction Vim 指南
  5. PHP支付宝支付开发流程
  6. 2019烟台计算机副高职称报名时间,烟台市公共企事业单位信息公开 政策文件 2019年度职称评审工作日程安排...
  7. P4717-[模板]快速莫比乌斯/沃尔什变换(FMT/FWT)
  8. linux关闭3389端口,如何修改云服务器(Windows、Linux)的默认3389远程端口?
  9. Android获取CPU使用率的几种方式
  10. LTE-网络架构及网元实体