Beautiful Mirrors

link

\(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;
}
posted @ 2022-06-30 14:54  Feyn618  阅读(12)  评论(0编辑  收藏  举报