吃辣椒

女生的网名这么多〃 提交于 2020-02-29 03:53:23

要点:对每个数考虑以它作为最大值的集合个数。

对每个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;
}

附:
帕斯卡恒等式

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!