CodeForce 359C Prime Number

Prime Number

CodeForces - 359C

Simon has a prime number x and an array of non-negative integers a1, a2, ..., an.

Simon loves fractions very much. Today he wrote out number on a piece of paper. After Simon led all fractions to a common denominator and summed them up, he got a fraction: , where number t equals xa1 + a2 + ... + an. Now Simon wants to reduce the resulting fraction.

Help him, find the greatest common divisor of numbers s and t. As GCD can be rather large, print it as a remainder after dividing it by number 1000000007 (109 + 7).


Input

The first line contains two positive integers n and x (1 ≤ n ≤ 105, 2 ≤ x ≤ 109) — the size of the array and the prime number.

The second line contains n space-separated integers a1, a2, ..., an (0 ≤ a1 ≤ a2 ≤ ... ≤ an ≤ 109).

Output

Print a single number — the answer to the problem modulo 1000000007 (109 + 7).

Examples
Input
2 2
2 2
Output
8
Input
3 3
1 2 3
Output
27
Input
2 2
29 29
Output
73741817
Input
4 5
0 0 0 0
Output
1
Note

In the first sample . Thus, the answer to the problem is 8.

In the second sample, . The answer to the problem is 27, as 351 = 13·27, 729 = 27·27.

In the third sample the answer to the problem is 1073741824 mod 1000000007 = 73741817.

In the fourth sample . Thus, the answer to the problem is 1.

OJ-ID:
CodeForce 359C

author:
Caution_X

date of submission:
20191004

tags:
数论

description modelling:
计算s,t的gcd。
输入a0,a1,a2,.....an,x
s=x^(a0+a1+a2+....+an).
t=x^(a1+a2+...+an)+x^(a0+a2+a3+....+an)+.....+x^(a0+a1+a2+.....+a(n-1)).

major steps to solve it:
1.提取分子上幂最小的数(根据t,s的关系可知该数一定可以和s整除)
2.比较提取的幂和(a0+a1+...an)的大小
3.快速幂取模输出答案

warnings:
分子可能比分母大

AC Code:

#include<algorithm>
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
map<ll,ll> book;
map<ll,ll>::iterator it;
ll a[100005];
ll qp(ll a,ll b)
{
    ll ans=1;
    while(b) {
        if(b&1)    {
            ans*=a;
            ans%=mod;
        }
        a*=a;
        a%=mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    ll n,x;
    scanf("%lld%lld",&n,&x);
    ll sum=0;
    for(int i=0;i<n;i++) {
        scanf("%lld",&a[i]);
        sum+=a[i];
    }
    for(int i=0;i<n;i++) {
        book[sum-a[i]]++;
    }
    for(it=book.begin();it!=book.end();it++) {
        if(it->second>=x) {
            ll tmp=it->second/x;
            book[it->first+1]+=tmp;
            book[it->first]-=tmp*x;
        }
    }
    it=book.begin();
    while(it->second==0)    it++;
    printf("%lld\n",qp(x,min(it->first,sum)));
    return 0; 
}

猜你喜欢

转载自www.cnblogs.com/cautx/p/11651104.html