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=1∑x−1pi+px⋅(1+fx)+i=x+1∑npi(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+px⋅fx+i=x+1∑npi⋅fi
化简得
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=1−px1+∑i=x+1npi⋅fi
从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=1⋅i=1∑xpi+px⋅(gx+2fx+1)+i=x+1∑npi(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=1−px1+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=1∑n⋅pi⋅(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;
}