题解 P6835 【[Cnoi2020]线形生物】
期望入门题。
这题非常的好,考察了期望的线性性质和选手的推柿子能力,给良心出题人点赞(然而我月赛时并没有做出来
注:期望的线性性质:在本题中体现为从
对于这类在图上随机游走的问题,我们一般会设
不妨先根据期望的定义列出
将
此时记
发现等式两边都含有
到这里维护一下前缀和,就可以直接转移了。总时间复杂度为
上式的化简步骤都是一些常见的状态转移方程的
Show the Code
#include<cstdio>
#define int ll
typedef long long ll;
const int mod=998244353;
int cnt=0;
int h[1000005],to[2000005],ver[2000005];
int f[1000005],sum[1000005],du[1000005];
inline int read() {
register int x=0,f=1;register char s=getchar();
while(s>'9'||s<'0') {if(s=='-') f=-1;s=getchar();}
while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
return x*f;
}
inline void add(int x,int y) {to[++cnt]=y;ver[cnt]=h[x];h[x]=cnt;}
signed main() {
int id=read(),n=read(),m=read();
for(register int i=1;i<=m;++i) {int x=read(),y=read();add(x,y);++du[x];}
for(register int x=1;x<=n;++x) {
f[x]=du[x]+1;
for(register int i=h[x];i;i=ver[i]) {
int y=to[i];
f[x]=((f[x]+(sum[x-1]-sum[y-1])%mod)%mod+mod);
}
sum[x]=(sum[x-1]+f[x])%mod;
}
printf("%lld\n",sum[n]);
return 0;
}