题意
n n n个检查点,每个检查点有 p i p_i pi的概率获胜,但一旦落败就得从头开始,通过所有就是胜利,每天只能检查一次,求胜利的期望天数。
题解
E
i
E_i
Ei表示通过前
i
i
i个检查点的期望。
到达第
i
i
i个点只有从
i
−
1
i-1
i−1过来,而
i
−
1
i-1
i−1到
i
i
i只有两种可能,胜利和失败。
如果失败的话在基础天数下再加上一个
E
i
E_i
Ei。
E
i
=
p
i
100
(
E
i
−
1
+
1
)
+
100
−
p
i
100
(
E
i
−
1
+
1
+
E
i
)
E_i=\frac{p_i}{100}(E_{i-1}+1)+\frac{100-p_i}{100}(E_{i-1}+1+E_i)
Ei=100pi(Ei−1+1)+100100−pi(Ei−1+1+Ei)
p
i
100
E
i
=
E
i
−
1
+
1
\frac{p_i}{100}E_i=E_{i-1}+1
100piEi=Ei−1+1
E
i
=
100
p
i
(
E
i
−
1
+
1
)
E_i=\frac{100}{p_i}(E_{i-1}+1)
Ei=pi100(Ei−1+1)
递推求解即可。
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
typedef long long ll;
const ll mod = 998244353;
int A[N];
vector<int>G;
inline ll quick_pow(ll x,int p){
ll res=1;
while(p){
if(p&1) res=(res*x)%mod;
x=(x*x)%mod, p>>=1;
}
return res;
}
inline ll inv(ll a){
ll inv_a=quick_pow(a,mod-2);
return inv_a;
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
ll res=0;
for(int i=1;i<=n;i++){
res=1ll*100*(res+1)%mod*inv(A[i])%mod;
}
cout<<res<<endl;
}