题意:
按照以下步骤依次进行游戏
1.随机生成一个x(按给的概率)
2.如果x大于等于当前所有生成的数中的最大值,那么返回1;否则进行3
3.获得当前生成的数的数量的平方的价值
问:价值的期望
思路:
概率DP,期望具有线性,可以递推,平方的期望可以转化为不平方的期望与平方期望的线性组合。
#include<iostream>
#define ll long long
using namespace std;
const int N=107,mod=998244353;
ll a[N],b[N],p[N];
ll qmi(ll m, ll k, ll p)
{
ll res = 1 % p, t = m;
while (k)
{
if (k&1) res = res * t % p;
t = t * t % p;
k >>= 1;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&p[i]);
sum+=p[i];
}
sum=qmi(sum,mod-2,mod);
for(int i=1;i<=n;i++)
{
p[i]=(p[i]*sum)%mod;
}
for(int i=n;i>0;i--)
{
ll x=1,y=qmi((1-p[i]+mod)%mod,mod-2,mod);
for(int j=i+1;j<=n;j++)
{
x+=p[j]*a[j];
x%=mod;
}
a[i]=(x*y)%mod;
}
for(int i=n;i>0;i--)
{
ll x=(1+2*p[i]*a[i])%mod,y=qmi((1-p[i]+mod)%mod,mod-2,mod);
for(int j=i+1;j<=n;j++)
{
x+=p[j]*(2*a[j]+b[j]);
x%=mod;
}
b[i]=(x*y)%mod;
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=(b[i]+2*a[i]+1)*p[i];
ans%=mod;
}
printf("%lld\n",ans);
}