Codeforces 1278F Cards 二项分布的期望 第二类斯特林降幂

题意:给定n,m,k对二项分布 x~B(n,1/m),求 E(x^k)

n,m<998244353,k<=5005

首先:E(x^k)!=(E(x))^k

思路:由期望公式得:

E(x^k)=\sum_{i=0}^{n}i^k*\binom{n}{i}*p^i*(1-p)^{n-i},p=1/m

由第二类斯特林降幂得:(将i^k拆开,S(k,j)为第二类斯特林数) 

E(x^k)=\sum_{i=0}^{n}( \sum_{j=1}^{i}S(k,j)*\binom{i}{j}*j! ) * \binom{n}{i}*p^i*(1-p)^{n-i}

交换求和顺序:

E(x^k)=( \sum_{j=1}^{n}S(k,j)*j! ) \sum_{i=j}^{n} \binom{n}{i}*\binom{i}{j}*p^i*(1-p)^{n-i}

化简:( j>k时S(k,j)=0 所以枚举到min(n,k),然后后面将组合数拆开)

E(x^k)= \sum_{j=1}^{min(n,k)}S(k,j) \sum_{i=j}^{n} \frac{n!}{(n-i)!*(i-j)!} *p^i*(1-p)^{n-i}

化简:(令i=i+j)

E(x^k)= \sum_{j=1}^{min(n,k)}S(k,j) \sum_{i=0}^{n-j} \frac{n!}{(n-i-j)!*(i)!} *p^{i+j}*(1-p)^{n-i-j}

化简:(凑n-j的二项式展开,把p^j提出来)

E(x^k)= \sum_{j=1}^{min(n,k)}S(k,j)*p^j*\frac{n!}{(n-j)!}\sum_{i=0}^{n-j} \frac{(n-j)!}{(n-i-j)!*(i)!} *p^{i}*(1-p)^{n-i-j}

E(x^k)= \sum_{j=1}^{min(n,k)}S(k,j)*p^j*\frac{n!}{(n-j)!}(p+1-p)^{n-j}

E(x^k)= \sum_{j=1}^{min(n,k)}S(k,j)*p^j*\frac{n!}{(n-j)!}

我们代入k=1,E(x)=n*p 刚好是我们熟悉的二项分布期望w

实现:我们分别预处理第二类斯特林数与n!/(n-j)!即可 (模998244353)   若k<=1e5有别的做法


import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);

        //System.out.println(qmod(2,5,100));


        long S[][]=new long[5005][5005];
        long mod=998244353;
        S[1][1]=1;
        S[0][0]=0;
        for(int i=1;i<=5000;i++){
            S[i][i]=1;S[i][0]=0;
        }
        for(int i=2;i<=5000;i++){
            for(int j=1;j<=i;j++){
                S[i][j]=(S[i-1][j]*j%mod+S[i-1][j-1])%mod;
            }
        }
        long n=sc.nextLong();long m=sc.nextLong();int k=sc.nextInt();
        m=qmod(m,mod-2,mod);
        long dp[]=new long[5005];dp[0]=1;
        for(int i=1;i<=Math.min(n,k);i++)dp[i]=dp[i-1]*(n-i+1)%mod;


        long ans=0;
        for(int i=1;i<=Math.min(n,k);i++){
            ans=(ans+dp[i]*qmod(m,i,mod)%mod*S[k][i]%mod)%mod;
        }
        System.out.println(ans);

    }
    public static long qmod(long a,long b,long mod){
        long ans=1;
        while(b>=1){

            if((b&1)!=0){
                ans=ans*a%mod;
            }
            a=a*a%mod;
            b=b>>1;
        }return ans;
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值