2021牛客暑期多校训练营4:B-Sample Game

题目链接

补题学习思路来源于:tcy今天长胖了吗溢流眼泪

题意: 1... n 1...n 1...n的数的生成概率为 p i p_i pi,执行以下操作:
1. 1. 1.随机生成一个数 x x x
2. 2. 2.如果 x x x不小于之前生成的所有 x x x,进行 1 1 1步骤,否则进入 3 3 3步骤
3. 3. 3.进行分数结算,分数为生成的所有 x x x的个数的平方

解法:概率dp
第一阶段:
c n t [ i ] cnt[i] cnt[i]表示第一个生成的数字是 i i i时还可以生成数字个数的期望,记 j j j为下一个生成的数字,则cnt[0]为初始状态
① i ≤ j ①i \leq j ij,执行 1 1 1步骤,生成 j j j,贡献个数为 c n t [ j ] + 1 cnt[j]+1 cnt[j]+1,则有 c n t [ i ] = ∑ j = i n p j ∗ ( c n t [ j ] + 1 ) cnt[i]=\sum_{j=i}^{n}p_j*(cnt[j]+1) cnt[i]=j=inpj(cnt[j]+1)
② i > j ②i>j i>j,执行 3 3 3步骤,生成 j j j后结束,贡献个数为 1 1 1,则有 c n t [ i ] = ∑ j = 0 i − 1 p j ∗ 1 cnt[i]=\sum_{j=0}^{i-1}p_j*1 cnt[i]=j=0i1pj1
综上, c n t [ i ] = ∑ j = 0 i − 1 p j + ∑ j = i n p j ( c n t [ j ] + 1 ) = ∑ j = 0 i − 1 p j + ∑ j = i + 1 n p j ( c n t [ j ] + 1 ) + p i ∗ ( c n t [ i ] + 1 ) cnt[i]=\sum_{j=0}^{i-1}p_j+\sum_{j=i}^{n}p_j(cnt[j]+1)=\sum_{j=0}^{i-1}p_j+\sum_{j=i+1}^{n}p_j(cnt[j]+1)+p_i*(cnt[i]+1) cnt[i]=j=0i1pj+j=inpj(cnt[j]+1)=j=0i1pj+j=i+1npj(cnt[j]+1)+pi(cnt[i]+1),移项化简可得 c n t [ i ] = cnt[i]= cnt[i]= ∑ j = 0 i p j + ∑ j = i + 1 n p j ∗ ( c n t [ j ] + 1 ) ( 1 − p i ) \sum_{j=0}^{i}p_j+\sum_{j=i+1}^{n}p_j*(cnt[j]+1) \over (1-p_i) (1pi)j=0ipj+j=i+1npj(cnt[j]+1)
第二阶段:
现在求 E ( c n t 2 ) \mathbb{E(cnt^2)} E(cnt2),不过 E ( c n t 2 ) ! = E 2 ( c n t ) \mathbb{E(cnt^2)}!=\mathbb{E^{2}(cnt)} E(cnt2)!=E2(cnt),也得不到 D ( c n t ) \mathbb{D(cnt)} D(cnt),用 d p [ i ] dp[i] dp[i]表示第一个选的数是 i i i时的分数期望,则有 d p [ i ] = E ( c n t [ i ] 2 ) dp[i]=\mathbb{E(cnt[i]^2)} dp[i]=E(cnt[i]2),0为初始状态,答案为 d p [ 0 ] dp[0] dp[0]
① i > j ①i>j i>j时,贡献个数为1, 1 2 = 1 1^2=1 12=1,所以这部分的分数贡献期望为 ∑ j = 0 i − 1 p j \sum_{j=0}^{i-1}p_j j=0i1pj
② i ≤ j ②i \leq j ij时,贡献个数为 c n t [ j ] + 1 cnt[j]+1 cnt[j]+1,这部分的分数贡献期望为 p j ∗ E ( ( c n t [ j ] + 1 ) 2 ) = p j ∗ ( E ( c n t [ j ] 2 ) + 2 ∗ E ( c n t ) + 1 ) p_j*\mathbb{E((cnt[j]+1)^2)}=p_j*(\mathbb{E(cnt[j]^2)}+2*\mathbb{E(cnt)}+1) pjE((cnt[j]+1)2)=pj(E(cnt[j]2)+2E(cnt)+1),即有 d p [ i ] = ∑ j = i n p j ∗ E ( c n t [ j ] + 1 ) 2 = ∑ j = i n p j ∗ ( E ( c n t [ j ] 2 ) + 2 ∗ E ( c n t ) + 1 ) = ∑ j = i n p j ∗ ( d p [ j ] + 2 ∗ c n t [ j ] + 1 ) dp[i] = \sum_{j=i}^np_j*\mathbb{E(cnt[j]+1)^2}=\sum_{j=i}^{n}p_j*(\mathbb{E(cnt[j]^2)}+2*\mathbb{E(cnt)}+1)=\sum_{j=i}^{n}p_j*(dp[j]+2*cnt[j]+1) dp[i]=j=inpjE(cnt[j]+1)2=j=inpj(E(cnt[j]2)+2E(cnt)+1)=j=inpj(dp[j]+2cnt[j]+1)
综上, d p [ i ] = ∑ j = 0 i − 1 p j + ∑ j = i n p j ∗ ( d p [ j ] + 2 ∗ c n t [ j ] + 1 ) dp[i]=\sum_{j=0}^{i-1}p_j+\sum_{j=i}^{n}p_j*(dp[j]+2*cnt[j]+1) dp[i]=j=0i1pj+j=inpj(dp[j]+2cnt[j]+1),移项化简得 d p [ i ] = dp[i]= dp[i]= ∑ j = 0 i p j + ∑ j = i + 1 n p j ∗ ( d p [ j ] + 2 ∗ c n t [ j ] + 1 ) + 2 ∗ c n t [ i ] ( 1 − p i ) \sum_{j=0}^{i}p_j+\sum_{j=i+1}^{n}p_j*(dp[j]+2*cnt[j]+1)+2*cnt[i] \over (1-p_i) (1pi)j=0ipj+j=i+1npj(dp[j]+2cnt[j]+1)+2cnt[i]

AcCode:

#include <iostream>
#include <algorithm>

#define int long long

const int mod = 998244353;
const int N = 110;
int p[N], cnt[N], sum[N], dp[N];

inline int quick_mow(int a, int b) {
	int ans = 1;
	a %= mod;
	while (b) {
		if (b & 1) ans = ans * a % mod;
		b >>= 1;
		a = a * a % mod;
	}
	return ans;
}

signed main() {
	int n, tsum = 0; scanf("%lld", &n);
	for (int i = 1; i <= n; i++) scanf("%lld", &p[i]), tsum += p[i];
	tsum = quick_mow(tsum, mod - 2);
	for (int i = 1; i <= n; i++) p[i] = p[i] * tsum % mod, sum[i] = (sum[i - 1] + p[i]) % mod;
	for (int i = n; i>=0; i--) {
		int temp = sum[i];
		for (int j = i + 1; j <= n; j++) {
			temp = (temp + p[j] * (cnt[j] + 1) % mod) % mod;
		}
		cnt[i] = temp * quick_mow((mod + 1 - p[i]) % mod, mod - 2) % mod;
	}
	for (int i = n; i >= 0; i--) {
		int temp = 2 * p[i] * cnt[i] % mod;
		for (int j = i + 1; j <= n; j++) {
			int tp = (dp[j] + 2 * cnt[j] + 1) % mod;
			temp = (temp + tp * p[j] % mod) % mod;
		}
		temp = (temp + sum[i]) % mod;
		dp[i] = temp * quick_mow((mod + 1 - p[i]) % mod, mod - 2) % mod;
	}
	printf("%lld\n", dp[0]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值