2021牛客暑期多校训练营4-B题

B题:Sample Game

原题链接:https://ac.nowcoder.com/acm/contest/11255/B

题目大意

请添加图片描述

其中 p i = w i ∑ j = x + 1 n p_i=\frac{w_i}{\sum_{j=x+1}^{n}} pi=j=x+1nwi
答案对 998244353取模

思路

对于x 令 f x = E ( x ) f_x=E(x) fx=E(x)
期望值为
f x = ∑ i = 1 x − 1 p i + p x ⋅ ( 1 + f x ) + ∑ i = x + 1 n p i ( f i + 1 ) f_x=\sum^{x-1}_{i=1}p_i+p_x\cdot(1+f_x)+\sum^{n}_{i=x+1}p_i(f_i+1) fx=i=1x1pi+px(1+fx)+i=x+1npi(fi+1)
= > f x = 1 + p x ⋅ f x + ∑ i = x + 1 n p i ⋅ f i => f_x=1+p_x\cdot f_x+ \sum_{i=x+1}^{n} p_i\cdot f_i =>fx=1+pxfx+i=x+1npifi
化简得
f x = 1 + ∑ i = x + 1 n p i ⋅ f i 1 − p x f_x=\frac{1+ \sum_{i=x+1}^{n} p_i\cdot f_i }{1-p_x} fx=1px1+i=x+1npifi
从n->1推导即可。
对x2 因为 E ( x 2 ) ≠ E 2 ( x ) E(x^2)\neq E^2(x) E(x2)=E2(x)
根据期望的的性质, E ( ( x + 1 ) 2 ) = E ( x 2 + 2 x + 1 ) = E ( x 2 ) + 2 E ( x ) + E ( 1 ) E((x+1)^2)=E(x^2+2x+1)=E(x^2)+2E(x)+E(1) E((x+1)2)=E(x2+2x+1)=E(x2)+2E(x)+E(1)
g x = E ( x 2 ) g_x=E(x^2) gx=E(x2)
g x = 1 ⋅ ∑ i = 1 x p i + p x ⋅ ( g x + 2 f x + 1 ) + ∑ i = x + 1 n p i ( g x + 2 f x + 1 ) g_x=1\cdot\sum_{i=1}^{x}p_i+p_x\cdot(g_x+2f_x+1)+\sum_{i=x+1}^{n}p_i(g_x+2f_x+1) gx=1i=1xpi+px(gx+2fx+1)+i=x+1npi(gx+2fx+1)
= > g x = 1 + 2 p x f x + ∑ i = x + 1 n p i ( g i + 2 f i ) 1 − p x =>g_x=\frac{1+2p_xf_x+\sum^n_{i=x+1}p_i(g_i+2f_i)}{1-p_x} =>gx=1px1+2pxfx+i=x+1npi(gi+2fi)
同理n->1推导即可。
最后
A n s = ∑ i = 1 n ⋅ p i ⋅ ( g i + 2 f i + 1 ) Ans=\sum_{i=1}^n\cdot p_i\cdot(g_i+2f_i+1) Ans=i=1npi(gi+2fi+1)
结果可能很大,所以要记得取模。还需要用到费马小定理和快速幂逆元。

代码实现

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=998244353;
ll w[110],f[110],g[110],s=0,p[110];
ll fmx(ll n)
{
	ll a=1,k=mod-2;
	while(k)
	{
		if(k&1)
		a=a*n%mod;
		n=n*n%mod;
		k>>=1;
	}
	return a;
}
ll fun(int x,int n)
{
	ll sum=0;
	for(int i=x;i<=n;i++){
		sum+=w[i]%mod*f[i]%mod;
		sum%=mod;
	}
	return sum;
}
ll gg(int x,int n)
{
	ll sum=0;
	for(int i=x;i<=n;i++){
		sum+=w[i]*(g[i]+2*f[i])%mod;
		sum%=mod;
	}
	return sum;
}
int main()
{
	int n;
	ll ans=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>w[i],s+=w[i];
	for(int i=1;i<=n;i++)
	p[i]=w[i]*fmx(s)%mod;
	for(int i=n;i>=1;i--)
		f[i]=(s+fun(i+1,n))%mod*fmx(s-w[i])%mod;
	for(int i=n;i>=1;i--)
		g[i]=(s+2*w[i]*f[i]+gg(i+1,n))%mod*fmx(s-w[i])%mod;
		
	for(int i=1;i<=n;i++)
		ans+=p[i]*(g[i]+2*f[i])%mod;
	cout<<(ans+1)%mod;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值