题目链接:钢琴演奏家
显然,直接枚举不好计算相同数字的情况,需要容斥。
不过我们可以先排序,然后从左往右计算,计算当前这个数字的时候,只能弹之前的,这样相当于给了相同数字一个顺序。
算是很简单的算贡献,计数了。
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;
}