喫辣椒

要點:對每個數考慮以它作爲最大值的集合個數。

對每個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;
}

附:
帕斯卡恆等式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章