2013年11月2日 星期六

Codeforces Round #209 (Div. 2) C - Prime Number


#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int mod=1000000007,m;
int s[100005];
priority_queue<int> que;
long long int pow(long long int k){
    if(k==1) return m;
    if(k==0) return 1;
    long long int t;
    t=pow(k/2),t=t*t%mod;
    if(k%2==0) return t;
    t=t*m%mod;
    return t;
}
int main(){
    int n,i,x,y;
    long long int add=0,ans=0;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        scanf("%d",&s[i]),add+=s[i],que.push(s[i]);
    x=1,y=que.top();que.pop();
    while(que.size()){
        if(y==que.top()) x++,que.pop();
        else{
            if(x) break;
            else y=que.top(),x++;
            que.pop();
        }
        if(x==m){
            x=0;
            que.push(y-1);
        }
    }
    if(y<0) y=0;
    printf("%I64d\n",pow(add-y));
}

沒有留言:

張貼留言