“二十年前的五四运动,
表现中国反帝反封建的资产阶级民主革命已经发展到了一个新阶段。”
五四青年节快乐!
计算期望可能通过递推,也可以通过期望的定义。
我们要牢牢把握概率和组合的关系,优化能提前求解出来的量。
我们对于枚举不同的i,j分为四种情况。
我们先复习
还有一种是左边太远,从右边靠近,和情况一刚好是对称的。
还有一种是两边都太远了了,所以概率为0。
但是,后来发现有个公式可以简化,而且特别显然。
这个就是朱世杰恒等式。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x3f3f3f3f;
const int N=1000010,M=3*N;
const int mod=998244353;
int fac[N];
int C[100][100];
int n;
int a[N];
int f[100][100][100];
int pow_m(int a,int x)
{
int res=1;
while(x)
{
if(x&1)
res=res*a%mod;
a=a*a%mod;
x>>=1;
}
return res;
}
int inv(int w)
{
return pow_m(w,mod-2);
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
C[0][0]=1;
for(int i=1;i<=n;i++)
{
C[i][0]=1;
for(int j=1;j<=i;j++)
{
C[i][j]=C[i-1][j-1]+C[i-1][j];
C[i][j]%=mod;
}
}
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
f[i][j][0]=1;
for(int k=1;k<=n;k++)
{
if(i+j<k)break;
for(int t=0;t<=k&&t<=i;t++)
{
f[i][j][k]+=C[i][t]*C[j][k-t]%mod;
f[i][j][k]%=mod;
}
}
}
}
fac[0]=1;
for(int i=1;i<=n;i++)
fac[i]=fac[i-1]*i%mod;
for(int i=1;i<=n;i++)
{
if(a[i]==n)
{
cout<<n-1<<" ";
continue;
}
int ans=0;
int l=-inf,r=inf;
for(int k=i-1;k>=1;k--)
{
if(a[k]>a[i])
{
l=k;
break;
}
}
for(int k=i+1;k<=n;k++)
{
if(a[k]>a[i])
{
r=k;
break;
}
}
for(int j=0;j<=n-2;j++)
{
int sum=0;
if((r-i<=j+1)&&(i-l<=j+1))
{
int suml=0;
for(int t=0;t<=r-i-1;t++)
{
if((j+1)-t-(i-l)>=0)
{
suml+=C[r-i][t]*f[l-1][n-r][(j+1)-t-(i-l)]%mod;
}
}
int sumr=0;
for(int t=0;t<=i-1-l;t++)
{
if((j+1)-t-(r-i)>=0)
{
sumr+=C[i-l][t]*f[l-1][n-r][(j+1)-t-(r-i)]%mod;
}
}
suml=suml*(i-l)%mod*fac[j]%mod;
sumr=sumr*(r-i)%mod*fac[j]%mod;
sum=suml+sumr;
sum%=mod;
sum=sum*fac[n-1-(j+1)]%mod;
sum=sum*inv(fac[n-1]);
sum%=mod;
ans+=sum*j%mod;
}
else if(r-i<=j+1)
{
sum=C[(n-1)-(r-i)][(j+1)-(r-i)];
sum=sum*fac[j]%mod;
sum=sum*(r-i)%mod;
sum*=fac[(n-1)-(j+1)];
sum%=mod;
sum=sum*inv(fac[n-1])%mod;
ans+=sum*j%mod;
}
else if(i-l<=j+1)
{
sum=C[(n-1)-(i-l)][(j+1)-(i-l)];
sum=sum*fac[j]%mod;
sum=sum*(i-l)%mod;
sum*=fac[(n-1)-(j+1)];
sum%=mod;
sum=sum*inv(fac[n-1])%mod;
ans+=sum*j%mod;
}
ans%=mod;
}
cout<<ans<<" ";
}
}