題目鏈接:http://codeforces.com/contest/359/problem/C
題意:給定和,對表達式通分之後計算分子分母的%。
思路:要求分子分母,令,分母即爲,任一分子則爲,主要在於處理分子部分,我們要求出所有分子的最大公約數,由於序列非降,所以取最後一項最小,但是可能存在係數爲的倍數情況,所以還需記錄一下相同項出現的次數。
所以每次取次數最小的,判斷其係數(出現次數)是否能被整除,如果不行,則此時的就是想要的指數,否則就將加到的係數上去,再循環上述操作。
AC代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
const ll mod=1e9+7;
ll qpow(ll x,ll y,ll mo)
{
ll ans=1;
x%=mo;
while(y){
if(y&1){
ans=ans*x%mo;
}
x=x*x%mo;
y>>=1;
}
return ans;
}
ll sum=0;
map<ll,ll>mp;
int main()
{
ll n,x;
scanf("%lld%lld",&n,&x);
mp.clear();
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
mp[a[i]]++;
sum=(sum+a[i]);
}
ll top=a[n-1];
while(mp[top]%x==0&&top>=-1){
mp[top-1]+=mp[top]/x;
top--;
}
if(top<0){
top=0;
}
ll tt=qpow(x,sum-top,mod);
printf("%lld\n",tt);
return 0;
}