CF1265E Beautiful Mirrors
传送门
题意:
小C有
N
N
N个从编号分别为
1
1
1到
N
N
N的镜子。她每天都会问一面镜子:“我漂亮吗?”而对于第
i
i
i面镜子,有
p
i
(
1
≤
i
≤
n
)
p_i (1\le i\le n)
pi(1≤i≤n)的概率告诉小C很漂亮。
她从第一面镜子开始,一个接一个的问镜子。每一天,对于她问的第
i
i
i个镜子,有两种情况:
如果第
i
i
i个镜子告诉小C她很漂亮:若此时
i
=
n
i=n
i=n,则小C就会开心到极点,停止对镜子的询问。否则,她第二天就会询问第
i
+
1
i+1
i+1个镜子。
如果第
i
i
i个镜子并没有告诉小C她很漂亮,她就会很伤心,第二天重新从第
1
1
1个镜子开始询问。
你需要计算小C询问完所有镜子后开心到极点的期望天数。
思路:期望DP
p
i
p_i
pi表示第
i
i
i天回答漂亮的概率,
d
p
i
dp_i
dpi表示从第
i
i
i天到第
n
+
1
n+1
n+1天的期望天数
状态转移:
d
p
i
=
1
+
p
i
⋅
d
p
i
+
1
+
(
1
−
p
i
dp_i=1+p_i\cdot dp_{i+1}+(1-p_i
dpi=1+pi⋅dpi+1+(1−pi
下面开始推式子
d
p
1
=
1
+
p
1
⋅
d
p
2
+
(
1
−
p
1
)
⋅
d
p
1
dp_1=1+p_1\cdot dp_2+(1-p_1)\cdot dp_1
dp1=1+p1⋅dp2+(1−p1)⋅dp1
化简得
d
p
1
=
d
p
2
+
1
p
1
dp_1=dp_2+\frac{1}{p_1}
dp1=dp2+p11,
d
p
2
=
d
p
1
−
1
p
1
dp_2=dp_1-\frac{1}{p_1}
dp2=dp1−p11
d
p
2
=
1
+
p
2
⋅
d
p
3
+
(
1
−
p
2
)
⋅
d
p
1
dp_2=1+p_2\cdot dp_3+(1-p_2)\cdot dp_1
dp2=1+p2⋅dp3+(1−p2)⋅dp1
带入
d
p
2
dp_2
dp2化简得
d
p
3
=
d
p
1
−
1
p
1
⋅
p
2
−
1
p
2
dp_3=dp_1-\frac{1}{p1\cdot p2}-\frac{1}{p_2}
dp3=dp1−p1⋅p21−p21
以此类推
d
p
4
=
d
p
1
−
1
p
1
⋅
p
2
⋅
p
3
−
1
p
2
⋅
p
3
−
1
p
3
dp_4=dp_1-\frac{1}{p_1\cdot p_2\cdot p_3}-\frac{1}{p_2\cdot p_3}-\frac{1}{p_3}
dp4=dp1−p1⋅p2⋅p31−p2⋅p31−p31
⋯
\cdots
⋯
d
p
n
+
1
=
d
p
1
−
1
p
1
⋯
p
n
−
1
p
2
⋯
p
n
−
⋯
−
1
p
n
dp_{n+1}=dp_1-\frac{1}{p_1\cdots p_n}-\frac{1}{p_2\cdots p_n}-\cdots-\frac{1}{p_n}
dpn+1=dp1−p1⋯pn1−p2⋯pn1−⋯−pn1
由于
d
p
n
+
1
=
0
dp_{n+1}=0
dpn+1=0,移项后得
d
p
1
=
1
p
1
⋯
p
n
+
1
p
2
⋯
p
n
+
⋯
+
1
p
n
dp_1=\frac{1}{p_1\cdots p_n}+\frac{1}{p_2\cdots p_n}+\cdots+\frac{1}{p_n}
dp1=p1⋯pn1+p2⋯pn1+⋯+pn1,
d
p
1
dp_1
dp1就是要求的答案
用费马小定理求逆元 a b ( m o d m ) = a ∗ b m o d − 2 ( m o d m ) \frac{a}{b}(mod\ m)=a*b^{mod-2}(mod\ m) ba(mod m)=a∗bmod−2(mod m)
AC代码:
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define debug(x) cout<<#x<<" = "<<x<<endl;
#define ll long long
#define endl '\n'
#define SZ(x) ((int)(x).size())
#define ALL(x) (x).begin(),(x).end()
const int N=2e5+10,M=2*N;
const ll mod=998244353;
const ll inf=1;
int n;
int a[N];
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans%mod;
}
ll ans;
void solve(){
cin>>n;
ll k=1;
rep(i,1,n) cin>>a[i];
per(i,n,1){
ll p=a[i];
ll t=p*qpow(100,mod-2)%mod;
k=1ll*k*t%mod;
ans=(ans+1ll*qpow(k,mod-2)%mod)%mod;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//int _;cin>>_;while(_--)
solve();
return 0;
}