首页 > 其他分享 >CF1823F Random Walk 树上随机游走

CF1823F Random Walk 树上随机游走

时间:2023-05-31 21:13:06浏览次数:50  
标签:gv frac int sum Random Walk fa CF1823F mod

设 \(F_{i}\) 为经过点 \(i\) 时的期望 , \(in_{i}\) 为点 \(i\) 度数 , 我们易得 :

\(\begin{aligned} F_{t} &= 1\\ F_{s} &= 1+ \frac{F_{fa}}{in_{fa}} + \sum_{v \in V_{i}}\frac{F_{v}}{in_{v}} \\ F_{u} &= \frac{F_{fa}}{in_{fa}} + \sum_{v \in V_{i}}\frac{F_{v}}{in_{v}}\;\;\;(u!=T||S) \end{aligned}\)

我们发现 \(F_{i}\) 只和它的父亲和有直接相连的儿子有关 , 可以写成一个方程组 , 用高斯消元解决 , 时间复杂度是 \(\mathcal{O}(N^3)\)

不足以通过本题 , 但是本题有一个优秀的性质 , 即是这是在一棵树上,当我们来到叶子节点时 , 便可以求解其系数 , 接下来就可以从下向上的解出每一项系数

按照我们刚才所说的列出树上高斯消元套路式子 \((powered\; by\) @ckain$ )$ :

设 \(F_{i}=g_{i}F_{fa} + c_{i}\)

将 \(2,3\) 写成一个式子:

\(\begin{aligned} \displaystyle F_{u} &= \frac{F_{fa}}{in_{fa}} + \sum_{v \in V_{i}}\frac{F_{v}}{in_{v}} + [u = S] \;\;\; (u!=T)\\ \displaystyle &= \frac{F_{fa}}{in_{fa}}+ \sum_{v \in V_{i}}\frac{g_{v}F_{u}+c_{v}}{in_{v}}+[u=S]\\ \displaystyle &=\frac{F_{fa}}{in_{fa}}+ \sum_{v \in V_{i}}\frac{g_{v}}{in_{v}}F_{u}+\sum_{v \in V_{i}}\frac{c_{v}}{in_{v}}+[u=S]\\ \end{aligned}\)

移项得:

\[(1-\sum_{v \in V_{i}}\frac{g_{v}}{in_{v}})F_{u}=\frac{F_{fa}}{in_{fa}}+\sum_{v \in V_{i}}\frac{c_{v}}{in_{v}}+[u=S]\;\;\; (u!=T) \]

此时我们就可以得知 \(g_{i} \& c_{i}\) 的式子了 \((\) 把左边除过去

时间复杂度 \(\mathcal{O}(N)\)

贴个代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int rd(void){
	int s=0, f=1; char c=getchar();
	while(c<'0' || c>'9') {if(c=='-') f=0; c=getchar();}
	while(c>='0' && c<='9') {s=s*10+c-'0'; c=getchar();}
	return f? s:-s;
}
const int N=2e5+10,mod=998244353;
int n;
int S,T;
int f[N],g[N],c[N],in[N];
vector<int> edge[N];
inline int qpow(int b,int p){
	int res=1;
	while(p){
		if(p&1)res=res*b%mod;
		b=b*b%mod;
		p>>=1;
	}
	return res;
}
void dfs1(int x,int fa){
	int gv=0,cv=0; 
	for(int i:edge[x]){
		if(i==fa)continue;
		dfs1(i,x);
		gv+=g[i]*qpow(in[i],mod-2)%mod;gv%=mod;
		cv+=c[i]*qpow(in[i],mod-2)%mod;cv%=mod;
	}
	gv=(1-gv+mod)%mod;
	gv=qpow(gv,mod-2);
	cv+=(x==S);
	if(fa!=T)g[x]=qpow(in[fa],mod-2)*gv%mod;
	c[x]=cv*gv%mod;
}
void dfs2(int x,int fa){
	if(x!=T)f[x]=(g[x]*f[fa]%mod+c[x])%mod;
	for(int i:edge[x]){
		if(i==fa)continue;
		dfs2(i,x);
	}
}
signed main(){
	n=rd();S=rd();T=rd();
	for(int i=1;i<n;i++){
		int x=rd(),y=rd();
		in[x]++;in[y]++;
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	dfs1(T,0);
	f[T]=1;
	dfs2(T,0);
	for(int i=1;i<=n;i++)printf("%lld ",f[i]);
	return 0;
}

标签:gv,frac,int,sum,Random,Walk,fa,CF1823F,mod
From: https://www.cnblogs.com/Linnyx/p/17447331.html

相关文章

  • Delphi RandomRange() - 返回指定范围内的随机整数
    DelphiRandomRange()-返回指定范围内的随机整数单元:math原型:functionRandomRange(constAFrom,ATo:Integer):Integer;beginifAFrom>ATothenResult:=Random(AFrom-ATo)+AToelseResult:=Random(ATo-AFrom)+AFrom;end;RandomRange......
  • Walkthrough-TR0LL 1
    0x01环境靶机地址:https://www.vulnhub.com/entry/tr0ll-1,100/该靶机偏CTF0x02过程1.信息收集┌──(root㉿kali)-[/home/kali/Desktop/oscp]└─#netdiscover-r192.168.60.0/24Currentlyscanning:Finished!|ScreenView:UniqueHosts......
  • Walkthrough-WINTERMUTE 1
    0x01环境靶机地址:https://www.vulnhub.com/entry/wintermute-1,239/两个靶机,做网络隔离STRAYLIGHT一张网卡桥接,另一张仅主机模式,桥接网卡时,可能有点问题,重选一下网卡就好了Kali做桥接网卡NEUROMANCER仅主机kali和NEUROMANCER网络不联通0x02过程STRAYLIGHT1.信息收......
  • skywalking 定制化
    cloudeasy-monitor/src/main/java/com/chinasofti/cloudeasy/api/external/SkyWalkingController.javacloudeasy-monitor/src/main/java/com/chinasofti/cloudeasy/model/skywalking/AlarmRule.javacloudeasy-monitor/src/main/java/com/chinasofti/cloudeasy/model/skywalkin......
  • 随机数Random
    packagecom.karl;importjava.util.Random;publicclassRandomDemo{publicstaticvoidmain(String[]args){//创建一个Random对象,用于生成随机数Randomr=newRandom();//调用Random提供的功能:nextInt得到随机数for(inti......
  • Vulnhub靶机DevRandom CTF1.1详细测试过程
    DevRandomCTF:1.1靶机信息名称:DevRandomCTF:1.1地址:https://www.vulnhub.com/entry/devrandom-ctf-11,450/识别目标主机IP地址─(kali㉿kali)-[~/Vulnhub/DevRandom]└─$sudonetdiscover-ieth1-r192.168.56.0/24Currentlyscanning:192.168.56.0/24|S......
  • Atcoder Grand Contest 062 D - Walk Around Neighborhood
    csy/bxwjz/bx首先将\(a\)排序,如果\(\sum\limits_{i=1}^{n-1}a_i<a_n\)显然就是\(-1\),否则必然有解。先发现一个trivial的事情,就是答案一定位于\([\dfrac{a_n}{2},a_n]\)中,这是因为我们判掉无解的条件之后,我们必然可以用前面的步数走到以\((a_n,0),(0,a_n),(-a_n,0),(......
  • docker 安装elasticsearch7.9 和 SkyWalkin
    1、相关地址:官网:https://skywalking.apache.org/下载:https://skywalking.apache.org/downloads/Github:https://github.com/apache/skywalking文档:https://skywalking.apache.org/docs/main/v9.1.0/readme/ 其他版本文档,先进https://skywalking.apache.org/docs/main/,选择版本,查......
  • hdu 4758 Walk Through Squares(AC自动机+DP,4级)
    WalkThroughSquaresTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:65535/65535K(Java/Others)TotalSubmission(s):234    AcceptedSubmission(s):58ProblemDescription  Onthebeamingdayof60thanniversaryofNJUST,asamilitary......
  • Windows平台下安装binwalk
    (4条消息)Windows平台下安装binwalk_binwalk下载_烟雨天青色的博客-CSDN博客https://blog.csdn.net/qq_38603541/article/details/126557575关于binwalkBinwalk是一款快速、易用,用于分析,逆向工程和提取固件映像的工具。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模......