排列组合
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int a[100007]; 5 const long long mod = 1e9+7; 6 long long inv[100007]; 7 long long qpow(int p,int q){ 8 long long s=1; 9 for(;q;q>>=1,p=1ll*p*p%mod) 10 if(q&1) 11 s=1ll*s*p%mod; 12 return s; 13 } 14 int main(){ 15 ios::sync_with_stdio(false); 16 cin.tie(NULL); 17 cout.tie(NULL); 18 int n,k; 19 cin>>n>>k; 20 for(int i=1;i<=n;++i) 21 cin>>a[i]; 22 sort(a+1,a+1+n); 23 for(int i=1;i<=n;++i) 24 inv[i]=qpow(i,mod-2); 25 long long sum=0; 26 long long temp=1; 27 for(int i=k;i<=n;++i){ 28 sum=(sum+a[i]*temp%mod)%mod; 29 temp=temp*i%mod; 30 temp=temp*inv[i+1-k]%mod; 31 } 32 temp=1; 33 for(int i=n-k+1;i;--i){ 34 sum=(sum+mod-a[i]*temp%mod)%mod; 35 temp=temp*(n-i+1)%mod; 36 temp=temp*inv[n-i+2-k]%mod; 37 } 38 cout<<sum; 39 return 0; 40 }