传送门
本题考查对于期望的理解。期望一般由两种求法,一种是计算总贡献,然后除以总状态数,本题中总状态数是
n
!
n!
n!,不过总贡献会非常难求。第二种则是利用一些对称性,然后直接计算某个贡献产生的概率。
本题采用第二种方法,我们考虑对于 d d d而言,假设有 D D D个值满足大于等于 b b b,设这些值为有用值,其它为无用值,那么对于 d d d中第 a a a个有用值后的任意值都会对期望产生贡献,而小于等于第 a a a个有用值之前的数产生的贡献都为0。首先考虑有用值对期望的贡献,由于每个有用值出现在第 a a a个有用值之后的概率是相同的,考虑到有 D D D个有用值,故期望贡献为 D − a D ⋅ d i \frac{D-a}D\cdot d_i DD−a⋅di(假设这个有用值是 d i d_i di)。然后考虑无用值,这些值必须出现在第 a a a个有用值之后才会产生贡献,仍然利用对称性,每个无用值出现在第 i i i个有用值之后的概率都是相同的,考虑到有 D + 1 D+1 D+1个空隙(两个相邻有用值之间的区域)可选,又必须出现在第 a a a个空隙之后,故期望贡献为(假设这个无用值为 d i d_i di) D + 1 − a D + 1 d i \frac{D+1-a}{D+1}d_i D+1D+1−adi。
最后化解下式子,利用前缀和搞一下即可。
int n,m,d[maxn];
int sum[maxn];
int main(){
n=rd(),m=rd();
FOR(i,1,n+1)d[i]=rd();
sort(d+1,d+1+n);
FOR(i,1,n+1){
sum[i]=(sum[i-1]+d[i])%mod;
}
FOR(i,1,m+1){
int a=rd(),b=rd();
int x=lower_bound(d+1,d+1+n,b)-d;
int D=n-x+1;
if(D<a)wrn(0);
else{
int ans=0;
ans=(1ll-1ll*a*qpow(D,mod-2,mod)%mod)*(sum[n]-sum[x-1])%mod;
ans=(1ll*ans+(1ll-1ll*a*qpow(D+1,mod-2,mod)%mod)*sum[x-1]%mod)%mod;
ans=(ans%mod+mod)%mod;
wrn(ans);
}
}
}