正题
以前一直都一直在凭感觉做概率期望,直到我遇到了这一公式题:排名估算
如果做不出来的话就让我们一起学习吧!
如果做得出来给您跪了!
首先了解几个符号:
表示A发生的机率。
B发生下A发生的概率
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);
}