比赛 ZLXSCDay1 评测结果 AAWWTTTTTT
题目名称 PERICA 最终得分 20
用户昵称 Rapiz 运行时间 6.002 s
代码语言 C++ 内存使用 1.22 MiB
提交时间 2016-03-19 10:03:08
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100000+1;
const long long MOD=1000000007;
bool isPrime[MAXN];
int n,k,prime[10000],e[10000],sz=0;//prime,e[0...sz-1]
long long a[MAXN],ans;
void makeprime(){
	memset(isPrime,1,sizeof(isPrime));
	for(int i=2;i<=n;i++)
		if(isPrime[i]) for(int k=2;i*k<=n;k++) isPrime[i*k]=0;
	for(int i=2;i<=n;i++) if(isPrime[i]) prime[sz++]=i;
}
void add_int(int n,int d){//d=1乘 d=-1除
	for(int i=0;i<sz&&n!=1;i++)
		while(n%prime[i]==0) n/=prime[i],e[i]+=d;
}
int main(){
	freopen("perica.in","r",stdin);
	freopen("perica.out","w",stdout);
	scanf("%d%d",&n,&k);
	makeprime();
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	sort(a+1,a+n+1);
	int same=0,before=0;
	for(int i=1;i<=n;i++){
		if(i<k) continue;
		else if(i>k) add_int(i-k,-1),add_int(i-1,1);
		int c=1;
		for(int p=0;p<sz;p++)                                                                                         
			for(int j=0;j<e[p];j++) 
				c=(prime[p]*c)%MOD;
		ans+=a[i]*c;
	}
	printf("%d",ans);
}