要点:对每个数考虑以它作为最大值的集合个数。
对每个pi统计数组中比他小的数,从这些数中选k-1个组成的k个数中pi最大,可视为这个pi值对答案的贡献。
对每个pi,如果存在,从比它小的数里面挑选k-1个数组成k个数,则这k个数中pi的值最大。(pi 乘以 对应的组合数个数 ) 可看作pi对整个答案的贡献。
即:最大值*C(N-1)(k-1) + 次大值 *C(N-2)(k-1)…
警告!!小心数组越界!!
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int maxN = 100001;
long long int C[maxN][51];
long long int d[maxN];
long long int mod = 1000000007;
int N;
void init(){
for(int i=0;i<= N;i++){
C[i][0]=1;
if(i<=50){ //注意数组千万不要越界啊!!!
C[i][i] =1;
}
}
for(int i=2;i<=N;i++){
for(int j=1;j<i&&j<=50;j++){
C[i][j]=((C[i-1][j]%mod)+(C[i-1][j-1]%mod))%mod;//帕斯卡恒等式
}
}
}
int main()
{
long long int s;
int k;
cin>>N>>k;
init();
s=0;
for(int i=0;i<N;i++){
cin>>d[i];
}
sort(d,d+N); // 从小到大排序
for(int i=k-1;i<N;i++){
s+=((d[i]%mod)*(C[i][k-1]%mod))%mod;
s%=mod;
}
cout<<s%mod<<'\n';
return 0;
}
附:
帕斯卡恒等式