CF1096E The Top Scorer

Link
枚举自己的分数\(i\),再枚举有多少人\(j\)的分数是\(i\),那么答案就是\(\sum\limits_{i=r}^s\sum\limits_{j=1}^p\frac{f(s-ij,p-j,i){p-1\choose j-1}}j\),其中\(f(n,m,l)\)是指把\(n\)个球放进\(m\)个盒子,每个盒子中的球数必须\(的方案数。
容斥+隔板法得到\(f(n,m,l)=\sum\limits_{i=0}^m(-1)^i{m\choose i}{n-il+m-1\choose m-1}\)。注意要先判断\(f(n,m,l)=0\)的情况。

#include
const int N=5107,P=998244353;
int r,p,s,c[N][N],inv[107];
int mod(int x){return x+(x>>31&P);}
int inc(int a,int b){return mod(a+b-P);}
int dec(int a,int b){return mod(a-b);}
int mul(int a,int b){return 1ll*a*b%P;}
int pow(int a,int k){int r=1;for(;k;k>>=1,a=mul(a,a))if(k&1)r=mul(a,r);return r;}
int C(int n,int m){return n<0||m<0||n=s) ans=inc(ans,mul(mul(inv[j],C(p-1,j-1)),f(s-i*j,p-j,i)));
    printf("%d",mul(ans,pow(C(s-r+p-1,p-1),P-2)));
}

你可能感兴趣的:(CF1096E The Top Scorer)