期望|组合数学|概率

文章介绍了如何通过递推和组合关系,特别是朱世杰恒等式,解决C++中关于区间内元素分布的问题,涉及组合数计算和动态规划方法。
摘要由CSDN通过智能技术生成

“二十年前的五四运动,

表现中国反帝反封建的资产阶级民主革命已经发展到了一个新阶段。”

五四青年节快乐!

计算期望可能通过递推,也可以通过期望的定义。

我们要牢牢把握概率和组合的关系,优化能提前求解出来的量。

图片

图片

图片

我们对于枚举不同的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<<" ";   } }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值