CF1823F Random Walk 树上随机游走
设
我们发现
不足以通过本题 , 但是本题有一个优秀的性质 , 即是这是在一棵树上,当我们来到叶子节点时 , 便可以求解其系数 , 接下来就可以从下向上的解出每一项系数
按照我们刚才所说的列出树上高斯消元套路式子
设
将
移项得:
此时我们就可以得知
时间复杂度
贴个代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现