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;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章