Loading

CF1265E Beautiful Mirrors

题面

solution

以前做过一道类似的题,这似乎是一种很经典的期望题。

\(dp_i\) 表示从第 \(i\) 面镜子到第 \(n\) 面镜子的期望天数。

转移柿子:

\[dp_i = p_i \times (dp_{i + 1} + 1) + (1 - p_i) \times (dp_1 + 1) \]

其中

\(dp_{n + 1} = 0\)

然后你会发现,这个柿子直接转移的话根本没法转移,求 \(dp_1\) 的时候要用到 \(dp_1\)

开始推柿子:

\(dp_1\) :

\(dp_1 = p_1 \times dp_2 + (1 - p_1) \times dp_1 + 1\)

\(p_1 \times dp_1 = p_1 \times dp_2 + 1\)

\(dp_1 = dp_2 + \frac{1}{p_1}\)

然后是 \(dp_2\)

\(dp_2 = p_2 \times dp_3 + (1 - p_2) \times dp_1 + 1\)

\(dp_2 = p_2 \times dp_3 + (1 - p_2) \times (dp_2 + \frac{1}{p_1}) + 1\)

化简得到:

\(p_2 \times dp_2 = p_2 \times dp_3 + \frac{1}{p_1} - \frac{p_2}{p_1} + 1\)

\(dp_2 = dp_3 + \frac{1}{p_1 p_2} + \frac{1}{p_2} - \frac{1}{p_1}\)

于是

\(dp_1 = dp_3 + \frac{1}{p_1 p_2} + \frac{1}{p_2}\)

一直推下去得到:

\(dp_1 = dp_{i + 1} + \sum_{j = 1}^{i} \prod_{k = i - j + 1}^{i} \frac{1}{p_k}\)

后面那玩意就是

\(\frac{1}{p_1 p_2 \dots p_i} + \frac{1}{p_2p_3 \dots p_i}+ \dots + \frac{1}{p_{i - 1}p_i} + \frac{1}{p_o}\)

然后因为 \(dp_{n + 1} = 0\)

一直推到 \(n\) 就好了。

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXA = 1e4 + 5;
const int MAXB = 2e5 + 5;
const int MAXC = 1e6 + 5;
const int mod = 998244353;
int read() {
  int x = 0, f = 1; char c = getchar();
  while(c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}
  while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}
  return x * f;
}
int a[MAXB], n, Ans, tmp = 1;
int quick_pow(int x, int y) {
   int ret = 1;
   while(y) {
   	 if(y & 1) ret = (ret * x) % mod;
   	 y >>= 1;
   	 x = (x * x) % mod;
   }
   return ret;
}
signed main() {
   n = read();
   for (int i = 1; i <= n; i++) a[i] = read();
   for (int i = n; i >= 1; i--) {
	 tmp = tmp * quick_pow(a[i], mod - 2) % mod * 100 % mod;
	 Ans = (Ans + tmp) % mod;
   }
   cout<<Ans;
   return 0;
}
posted @ 2021-10-27 19:19  Dita  阅读(27)  评论(0编辑  收藏  举报