Codeforces Round #604 (Div. 2) E. Beautiful Mirrors(概率DP)

题目链接:https://codeforces.com/contest/1265/problem/E

题目大意:

  有n面镜子,有个家伙从第一面镜子开始,问第i个镜子自己美不美,镜子有 p i p_i pi概率说美,那她就第二天问下一个镜子,如果已经到了第n个镜子,并且说她美,那她就很高兴。如果中途有一次镜子说她丑的一批,他就会重新从第一个镜子开始问,求他开心的期望天数。

题目思路:

  简单到不能再简单的概率DP,无奈实在太菜,还是没搞出来。。看到题解秒懂。
  两种做法,第一种:定义 f i f_i fi表示让第i面镜子说她美的期望天数,那么我们要求 f [ i ] f[i] f[i],假设已经知道了i-1面镜子需要多少,那么i面镜子需要的天数只用多一天的概率是 p i p_i pi,就是直接说她美,这样就只需要花 f [ i − 1 ] + 1 f[i-1]+1 f[i1]+1天,还有一种可能是她先多了一天到达第i个镜子,然后说她丑,再重新跑,需要的天数就是 f [ i − 1 ] + 1 + f [ i ] f[i-1]+1+f[i] f[i1]+1+f[i],那么算上两种情况的概率得到
f [ i ] = p [ i ] ∗ ( f [ i − 1 ] + 1 ) + ( 1 − p [ i ] ) ∗ ( f [ i − 1 ] + 1 + f [ i ] ) f[i]=p[i]*(f[i-1]+1)+(1-p[i])*(f[i-1]+1+f[i]) f[i]=p[i](f[i1]+1)+(1p[i])(f[i1]+1+f[i])
  由于0面镜子不需要天数,所以 f [ 0 ] = 0 f[0]=0 f[0]=0

 
  第二种方法是qsc的方法,可以直接看他视频:传送门
  说一下我对这种方法的理解,就是设 f [ i ] f[i] f[i]为从i到n+1所需要的步数,n+1到n+1所需要的0天,那么对于 f [ i ] f[i] f[i]有两种情况,一种是运气好,直接一发就是漂亮,那么所需要的天数就是 1 + f [ i + 1 ] 1+f[i+1] 1+f[i+1],还有个运气不好的,那就被打回原形,就是 1 + f [ 1 ] 1+f[1] 1+f[1],所以得到 f [ i ] = p [ i ] ∗ ( f [ i + 1 ] + 1 ) + ( 1 − p [ i ] ) ∗ ( 1 + f [ 1 ] ) f[i]=p[i]*(f[i+1]+1)+(1-p[i])*(1+f[1]) f[i]=p[i](f[i+1]+1)+(1p[i])(1+f[1])
  化简后与qsc视频的那个格式一致,然后其他的就可以看卿学姐的视频啦。
 &emsp代码为第一种方法的代码。

以下是代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<math.h>
#include<algorithm>

using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int MAXN=4e5+5;
const int MOD = 998244353;
ll powmod(ll x,ll y){
    
    
    ll rst=1;
    for(;y;y>>=1){
    
    
        if(y&1){
    
    
            rst=rst*x%MOD;
        }
        x=x*x%MOD;
    }
    return rst;
}
int main(){
    
    
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;ll x;
    while(cin>>n){
    
    
        ll ans=0;
        rep(i,1,n){
    
    
            cin>>x;
            ans=(1+ans)%MOD*100%MOD*powmod(x,MOD-2)%MOD;
        }
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/toohandsomeIeaseId/article/details/104228057