Beautiful Mirrors
用 \(f_i\) 来代表准备照第 i 面镜子,照完所有镜子的期望天数。有 :
\[f_i=\begin{cases}f_1+1 & (p=1-p_i)\\f_{i+1}+1& (p=p_i)\end{cases}
\]
两种可能。于是就有:
\[f_i=(1-p_i)f_1+p_if_{i+1}+1
\]
似乎不是很满足无后效性。于是考虑一点一点从小到大找规律。
\[f_1=f_2+\frac{1}{p_1}
\]
\[f_2=f_3+\frac{1-p_2+p_1}{p_1p_2}=f_3+\frac{1}{p_1p_2}-\frac{1}{p_1}+\frac{1}{p_2}
\]
\[f_1=f_2+\frac{1}{p_1}=f_3+\frac{1}{p_1p_2}+\frac{1}{p_2}
\]
于是找到规律:
\[f_1=f_{i+1}+\sum\limits_{j=1}^{i}\prod\limits_{k=j}^m\frac{1}{p_k}
\]
把 i=m 这个特殊值带进去可以得到
\[ans=\sum\limits_{i=1}^m\prod\limits_{j=i}^m\frac{1}{p_j}
\]
扫一遍计算累加即可。复杂度 \(O(N\log P)\) 。
代码异常简洁。
#include<bits/stdc++.h>
//#define zczc
#define int long long
const int mod=998244353;
const int N=200010;
using namespace std;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
wh*=f;return;
}
inline int qpow(int s1,int s2){
if(s2==1)return s1;
int an=qpow(s1,s2>>1);
if(s2&1)return an*an%mod*s1%mod;
else return an*an%mod;
}
int m,ans=0,now=1,a[N];
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
read(m);
for(int i=1;i<=m;i++)read(a[i]);
for(int i=m;i;i--){
now=now*100%mod*qpow(a[i],mod-2)%mod;
ans=(ans+now)%mod;
}
printf("%lld",ans);
return 0;
}
一如既往,万事胜意