題目鏈接:鋼琴演奏家
顯然,直接枚舉不好計算相同數字的情況,需要容斥。
不過我們可以先排序,然後從左往右計算,計算當前這個數字的時候,只能彈之前的,這樣相當於給了相同數字一個順序。
算是很簡單的算貢獻,計數了。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
int n,m,a[N],res,f[N],inv[N];
int qmi(int a,int b=mod-2){
int res=1;
while(b){if(b&1LL) res=1LL*res*a%mod; a=1LL*a*a%mod; b>>=1LL;}
return res;
}
inline int C(int n,int m){
if(!n||!m) return 1;
return f[n]*inv[m]%mod*inv[n-m]%mod;
}
inline void solve(){
cin>>n>>m; res=0;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
sort(a+1,a+1+n);
for(int i=m;i<=n;i++) res=(res+a[i]*C(i-1,m-1))%mod;
printf("%lld\n",res);
}
signed main(){
f[0]=1; for(int i=1;i<=1e6;i++) f[i]=f[i-1]*i%mod;
inv[1000000]=qmi(f[1000000]); for(int i=1e6-1;i>=0;i--) inv[i]=(i+1)*inv[i+1]%mod;
int T; cin>>T; while(T--) solve();
return 0;
}