正题
题目链接:https://www.luogu.com.cn/problem/P6835?contestId=34123
题目大意
n+1n+1n+1个点,其中每个iii向i+1i+1i+1连边(i≤n)(i\leq n)(i≤n),然后有mmm对(u,v)(u,v)(u,v)表示uuu向vvv连边u≥vu\geq vu≥v。开始在点111,每次随机走一个相连的点。求到n+1n+1n+1号点的期望步数。
解题思路
就是没有后效性的随机游走,设fif_ifi表示iii号点走向i+1i+1i+1号点的期望步数,zzz表示出度,我们就有方程fi=∑i−>j(∑k=ji−1fk)+fiz+1f_i=\frac{\sum_{i->j}(\sum_{k=j}^{i-1}f_k)+f_i}{z}+1fi=z∑i−>j(∑k=ji−1fk)+fi+1
我们将(z−1)∗fiz\frac{(z-1)*f_{i}}{z}z(z−1)∗fi提出就有
fi−(z−1)zfi=∑i−>j(∑k=ji−1fk)z+1f_i-\frac{(z-1)}{z}f_i=\frac{\sum_{i->j}(\sum_{k=j}^{i-1}f_k)}{z}+1fi−z(z−1)fi=z∑i−>j(∑k=ji−1fk)+1
⇒fi=∑i−>j(∑k=ji−1fk)+z\Rightarrow f_i=\sum_{i->j}(\sum_{k=j}^{i-1}f_k)+z⇒fi=i−>j∑(k=j∑i−1fk)+z
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e6+10,XJQ=998244353;
struct node{ll to,next;
}a[N*2];
ll n,m,tot,ls[N],p[N],f[N],sum[N];
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
int main()
{ll id;scanf("%lld%lld%lld",&id,&n,&m);for(ll i=1;i<=m;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);}for(ll x=1;x<=n;x++){ll z=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;z++;f[x]=(f[x]+sum[x-1]-sum[y-1]+1+XJQ)%XJQ;}f[x]=(f[x]+1)%XJQ;sum[x]=(sum[x-1]+f[x])%XJQ;}printf("%lld",sum[n]);
}