2021牛客暑期多校训练营4 B.Sample Game(期望平方递推)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021牛客暑期多校训练营4 B.Sample Game(期望平方递推)相关的知识,希望对你有一定的参考价值。
定义 f [ i ] f[i] f[i]表示当前最大的数字为 i i i,游戏结束还需要的游戏次数
f [ i ] = 1 + ∑ j = i + 1 n f [ j ] ∗ p j + p i ∗ f [ i ] f[i]=1+\\sum\\limits_{j=i+1}^n f[j]*p_j+p_i*f[i] f[i]=1+j=i+1∑nf[j]∗pj+pi∗f[i]
f [ i ] = 1 + ∑ j = i + 1 n p j ∗ f [ j ] 1 − p i f[i]=\\frac{1+\\sum\\limits_{j=i+1}^n p_j*f[j]}{1-p_i} f[i]=1−pi1+j=i+1∑npj∗f[j]
令 g [ i ] g[i] g[i]为当前最大数字为 i i i,还能获得的期望分数
因为 E [ ( x + 1 ) 2 ] = E [ x 2 ] + 2 ∗ E [ x ] + 1 E[(x+1)^2]=E[x^2]+2*E[x]+1 E[(x+1)2]=E[x2]+2∗E[x]+1
g [ x ] = ∑ i = 1 x − 1 p i + ∑ i = x n ( g [ i ] + 2 ∗ f [ i ] + 1 ) ∗ p i g[x]=\\sum\\limits_{i=1}^{x-1}p_i+\\sum\\limits_{i=x}^n(g[i]+2*f[i]+1)*p_i g[x]=i=1∑x−1pi+i=x∑n(g[i]+2∗f[i]+1)∗pi
g [ x ] = 1 + ∑ i = x + 1 n p i ∗ ( g [ i ] + 2 ∗ f [ i ] ) + 2 ∗ p i ∗ f i 1 − p i g[x]=\\frac{ 1+\\sum\\limits_{i=x+1}^np_i*(g[i]+2*f[i])+2*p_i*f_i}{1-p_i} g[x]=1−pi1+i=x+1∑npi∗(g[i]+2∗f[i])+2∗pi∗fi
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int maxn = 3e5+10;
int n,f[maxn],g[maxn],sum[maxn],p[maxn];
int quick(int x,int n)
{
x = ( x%mod+mod ) % mod;
int ans = 1;
for( ; n ; n>>=1,x=x*x%mod )
if( n&1 ) ans = ans*x%mod;
return ans;
}
void upd(int &x,int y){ x = ( x+y )%mod; }
signed main()
{
cin >> n;
for(int i=1;i<=n;i++) cin >> p[i], sum[i] = sum[i-1]+p[i];
int inv = quick( sum[n],mod-2 );
for(int i=1;i<=n;i++) p[i] = p[i]*inv%mod, sum[i] = ( sum[i-1]+p[i] )%mod;
int sf = 0, sg = 0;
for(int i=n;i>=0;i--)
{
upd( f[i],1+sf );
f[i] = f[i]*quick( 1-p[i],mod-2 )%mod;
upd( g[i],1+sg+2*p[i]*f[i]%mod );
g[i] = g[i]*quick( 1-p[i],mod-2 )%mod;
upd( sf, f[i]*p[i]%mod ); upd( sg,p[i]*( g[i]+2*f[i] )%mod );
}
cout << ( g[0]%mod+mod )%mod;
}
以上是关于2021牛客暑期多校训练营4 B.Sample Game(期望平方递推)的主要内容,如果未能解决你的问题,请参考以下文章
2021牛客暑期多校训练营5 G.Greater Integer, Better LCM(搜索,子集合并)