[CF1265E] Beautiful Mirrors - 概率dp
Description
有 (n) 个镜子,编号从 (1) 到 (n)。每天都会询问一面镜子,第 (i) 个镜子有 (p_i) 的概率回答漂亮。
如果第 (i) 面镜子回答漂亮,如果 (i=n) 则游戏结束,否则明天询问 (i+1)。
如果第 (i) 面镜子回答不漂亮,明天从 (i=1) 开始。
求游戏结束的期望天数。
Solution
设 (f_i) 表示从 1 升级升到 i 的天数期望
转移时考虑从 i-1 升到 i 的过程
有 p 的概率成功升级,此时的升级代价是 1
有 (1-p) 的概率升级失败,此时的升级代价则是 (1+f_i)
化简后顺序递推即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
const int mod = 998244353;
int p[N], n, f[N];
int qpow(int p, int q)
{
return (q & 1 ? p : 1) * (q ? qpow(p * p % mod, q / 2) : 1) % mod;
}
int inv(int p)
{
return qpow(p, mod - 2);
}
signed main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> p[i];
for (int i = 2; i <= n + 1; i++)
f[i] = 100 * inv(p[i - 1]) % mod * (1 + f[i - 1]) % mod;
cout << f[n + 1] << endl;
}