CF1265E Beautiful Mirrors

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(1in)的概率告诉小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+pidpi+1+(1pi
下面开始推式子
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+p1dp2+(1p1)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=dp1p11
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+p2dp3+(1p2)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=dp1p1p21p21
以此类推
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=dp1p1p2p31p2p31p31
⋯ \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=dp1p1pn1p2pn1pn1
由于 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=p1pn1+p2pn1++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)=abmod2(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值