鋼琴演奏家

題目鏈接:鋼琴演奏家


顯然,直接枚舉不好計算相同數字的情況,需要容斥。

不過我們可以先排序,然後從左往右計算,計算當前這個數字的時候,只能彈之前的,這樣相當於給了相同數字一個順序。

算是很簡單的算貢獻,計數了。


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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章