[CF1265E] Beautiful Mirrors 期望DP题解

题意简述

GM 有 n ( 1 ≤ n ≤ 2 ∗ 1 0 5 ) n(1≤n≤2*10^5) n(1n2105) 面镜子,他每天问其中一面镜子“GM 帅不帅”, i i i 号镜子有 p i % ( 1 ≤ p i ≤ 100 ) p_i\%(1≤pi≤100) pi%(1pi100) 的概率回答帅。

第一天,GM 会从 1 1 1 号镜子开始问起。如果某天 GM 问了 i ( i ≠ n ) i(i≠n) i(i=n)号镜子,并且镜子回答帅,那么第二天 GM 会问 i + 1 i+1 i+1 号镜子。如果某天 GM 问了 n n n 号镜子,并且镜子回答帅,那么 GM 就觉得很满意,并且以后不会再问镜子了。如果某天镜子没有回答帅,那么第二天 GM 会重新从 1 1 1 号镜子开始问。

求到 GM 满意为止,问镜子的期望天数。

输入格式

第一行输入一个整数 n ( 1 ≤ n ≤ 2 ∗ 1 0 5 ) n(1 \leq n \leq 2 * 10^5) n(1n2105),表示镜子的个数。

第二行输入 n n n 个整数 p 1 , p 2 , . . . , p n ( 1 ≤ p i ≤ 100 ) p_1,p_2,...,p_n(1 \leq p_i \leq 100) p1,p2,...,pn(1pi100)

输出格式

输出一个整数,为答案模 998244353 998244353 998244353 的结果。

说明/提示

在第一个样例,只有一个镜子,并且它有 1 2 1 \over 2 21 的概率告诉GM 很漂亮。所以,让 GM 开心到极点的期望天数是 2 2 2 天。

样例

输入1
1
50
输出1
2
输入2
3
10 20 50
输出2
112

分析

d p [ i ] dp[i] dp[i] 为到了第 i i i 个镜子,并且 GM 满意的期望天数。
如果你学过期望,就不难推出 d p [ i ] = 1 × ( d p [ i − 1 ] + 1 ) × p i 100 + 2 × ( d p [ i − 1 ] + 1 ) × p i 100 × ( 1 − p i 100 ) + k × ( d p [ i − 1 ] + 1 ) × p i 100 × ( 1 − p i 100 ) k − 1 . . . dp[i]= 1\times (dp[i - 1] + 1) \times {p_i \over 100} + 2 \times (dp[i - 1] + 1) \times {p_i \over 100} \times (1 - {p_i \over 100} ) + k \times (dp[i - 1] + 1) \times {p_i \over 100} \times (1 - {p_i \over 100} ) ^ {k - 1}... dp[i]=1×(dp[i1]+1)×100pi+2×(dp[i1]+1)×100pi×(1100pi)+k×(dp[i1]+1)×100pi×(1100pi)k1...
          = ∑ k × ( d p [ i − 1 ] + 1 ) × p i 100 × ( 1 − p i 100 ) k − 1 ( k = 1 , 2 , 3... ) \ \ \ \ \ \ \ \ \ =\sum k \times (dp[i - 1] + 1) \times {p_i \over 100} \times (1 - {p_i \over 100} ) ^ {k - 1}(k=1,2,3...)          =k×(dp[i1]+1)×100pi×(1100pi)k1(k=1,2,3...)
          = ( d p [ i − 1 ] + 1 ) × p i 100 × ∑ j = 1 ∞ ∑ k = j ∞ ( 1 − p i 100 ) k − 1 \ \ \ \ \ \ \ \ \ =(dp[i - 1] + 1) \times {p_i \over 100} \times \sum \limits_{j = 1} ^{\infty} \sum \limits_{k = j} ^{\infty}(1 - {p_i\over100})^{k - 1}          =(dp[i1]+1)×100pi×j=1k=j(1100pi)k1
突然发现,后面那一堆就是等比数列求和。于是那一堆
= ∑ j = 1 ∞ 100 p i ( 1 − p i 100 ) j − 1                         =\sum \limits_{j = 1} ^{\infty}{100 \over p_i}(1 - {p_i\over100})^{j - 1}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =j=1pi100(1100pi)j1                       
= 100 p i × ∑ j = 1 ∞ ( 1 − p i 100 ) j − 1                    ={100 \over p_i}\times\sum \limits_{j = 1} ^{\infty}(1 - {p_i\over100})^{j - 1}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =pi100×j=1(1100pi)j1                  
= ( 100 p i ) 2                                                =({100 \over p_i})^2\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =(pi100)2                                              
代入原式,于是 d p [ i ] = ( d p [ i − 1 ] + 1 ) × 100 p i             dp[i]=(dp[i - 1] + 1) \times {100 \over p_i}\ \ \ \ \ \ \ \ \ \ \ dp[i]=(dp[i1]+1)×pi100           
这里需要除法取模,要用到乘法逆元,我用的是费马小定理。

代码

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <climits>
#include <cstring>
#define LL long long
using namespace std;
const int MAXN = 2 * 1e5 + 5, Mod = 998244353;
int n, a[MAXN], dp[MAXN];
int Quick_Pow(int x, int y) {
	int i = x, j = y, ans = 1;
	for(; j; j >>= 1) {
		if(j & 1) ans = (LL)ans * i % Mod;
		i = (LL)i * i % Mod;
	}
	return ans;
}
int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++) {
		scanf("%d", &a[i]);
	}
	for(int i = 1; i <= n; i ++) {
		dp[i] = (LL)(dp[i - 1] + 1) * 100 % Mod;
		dp[i] = (LL)dp[i] * Quick_Pow(a[i], Mod - 2) % Mod;
	}
	printf("%d", dp[n]);
	return 0;
}

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值