比赛 |
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);
}