要點:對每個數考慮以它作爲最大值的集合個數。
對每個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;
}
附:
帕斯卡恆等式