题目链接:https://codeforces.com/contest/1265/problem/E
题目大意:
有n面镜子,有个家伙从第一面镜子开始,问第i个镜子自己美不美,镜子有 p i p_i pi概率说美,那她就第二天问下一个镜子,如果已经到了第n个镜子,并且说她美,那她就很高兴。如果中途有一次镜子说她丑的一批,他就会重新从第一个镜子开始问,求他开心的期望天数。
题目思路:
简单到不能再简单的概率DP,无奈实在太菜,还是没搞出来。。看到题解秒懂。
两种做法,第一种:定义
f
i
f_i
fi表示让第i面镜子说她美的期望天数,那么我们要求
f
[
i
]
f[i]
f[i],假设已经知道了i-1面镜子需要多少,那么i面镜子需要的天数只用多一天的概率是
p
i
p_i
pi,就是直接说她美,这样就只需要花
f
[
i
−
1
]
+
1
f[i-1]+1
f[i−1]+1天,还有一种可能是她先多了一天到达第i个镜子,然后说她丑,再重新跑,需要的天数就是
f
[
i
−
1
]
+
1
+
f
[
i
]
f[i-1]+1+f[i]
f[i−1]+1+f[i],那么算上两种情况的概率得到
f
[
i
]
=
p
[
i
]
∗
(
f
[
i
−
1
]
+
1
)
+
(
1
−
p
[
i
]
)
∗
(
f
[
i
−
1
]
+
1
+
f
[
i
]
)
f[i]=p[i]*(f[i-1]+1)+(1-p[i])*(f[i-1]+1+f[i])
f[i]=p[i]∗(f[i−1]+1)+(1−p[i])∗(f[i−1]+1+f[i])
由于0面镜子不需要天数,所以
f
[
0
]
=
0
f[0]=0
f[0]=0
第二种方法是qsc的方法,可以直接看他视频:传送门
说一下我对这种方法的理解,就是设
f
[
i
]
f[i]
f[i]为从i到n+1所需要的步数,n+1到n+1所需要的0天,那么对于
f
[
i
]
f[i]
f[i]有两种情况,一种是运气好,直接一发就是漂亮,那么所需要的天数就是
1
+
f
[
i
+
1
]
1+f[i+1]
1+f[i+1],还有个运气不好的,那就被打回原形,就是
1
+
f
[
1
]
1+f[1]
1+f[1],所以得到
f
[
i
]
=
p
[
i
]
∗
(
f
[
i
+
1
]
+
1
)
+
(
1
−
p
[
i
]
)
∗
(
1
+
f
[
1
]
)
f[i]=p[i]*(f[i+1]+1)+(1-p[i])*(1+f[1])
f[i]=p[i]∗(f[i+1]+1)+(1−p[i])∗(1+f[1])
化简后与qsc视频的那个格式一致,然后其他的就可以看卿学姐的视频啦。
&emsp代码为第一种方法的代码。
以下是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>
using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int MAXN=4e5+5;
const int MOD = 998244353;
ll powmod(ll x,ll y){
ll rst=1;
for(;y;y>>=1){
if(y&1){
rst=rst*x%MOD;
}
x=x*x%MOD;
}
return rst;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;ll x;
while(cin>>n){
ll ans=0;
rep(i,1,n){
cin>>x;
ans=(1+ans)%MOD*100%MOD*powmod(x,MOD-2)%MOD;
}
cout<<ans<<endl;
}
return 0;
}