学习笔记第五十六节:概率期望

正题

      以前一直都一直在凭感觉做概率期望,直到我遇到了这一公式题:排名估算

      如果做不出来的话就让我们一起学习吧!

      如果做得出来给您跪了

      首先了解几个符号:

      P(A)表示A发生的机率。

      P(A|B)B发生下A发生的概率

      P(AB)AB同时发生的概率。

      你可能觉得这些东西并没有什么用,下面让百度说一个例子:

      相信看完这个你一定对概率了解了一些。

      那么贝叶斯定理就十分显然了。

      对于这一题来说,我们可以很容易求出排名为i时出现m次全部都是名次比它大的概率。

      又因为排名为i的概率均等,所以就可以推出出现m次全部都是名次比它大时排名为i的概率,然后用这个东西乘上权值加起来就是答案。

      推出来发现是一个自然数幂和,直接用第二类斯特林数来求解就可以了。

#include<bits/stdc++.h>
using namespace std;

const long long mod=998244353,N=5010;
long long n;
int m;
long long inv[5010];
long long S[5010][5010];

long long ksm(long long x,long long t){
	long long tot=1;
	while(t){
		if(t&1) (tot*=x)%=mod;
		(x*=x)%=mod;
		t/=2;
	}
	return tot;
}

void prepare(){
	S[0][0]=1;
	inv[1]=1;
	for(int i=2;i<=m+2;i++) inv[i]=(mod-inv[mod%i])*(mod/i)%mod;
	for(int i=1;i<=m+1;i++)
		for(int j=0;j<=i;j++){
			S[i][j]=S[i-1][j]*j%mod;
			if(j) (S[i][j]+=S[i-1][j-1])%=mod;
		}
}

long long get_poly(long long x,int y){
	long long ans=0,T=1;
	for(int j=0;j<=y;j++)
		(T*=x%mod+1-j+mod)%=mod,(ans+=S[y][j]*inv[j+1]%mod*T%mod)%=mod;
	return ans;
}

int main(){
	scanf("%lld %d",&n,&m);prepare();
	long long A=get_poly(n-1,m),B=get_poly(n-1,m+1);
	printf("%lld\n",(A*(n%mod)%mod-B+mod)*ksm(A,mod-2)%mod);
}

猜你喜欢

转载自blog.csdn.net/Deep_Kevin/article/details/104031888
今日推荐