题意:给你序列ai,和x,求 的分子分母的最大公约数。
思路:化简公式得分母s=xa1 + a2 + ... + an,那么每个分子的表示即为x(s-ai),那么求最大公约数,即分子的表现形式即为(x^k)*m,且m不能被x整除,假设分子最小的是x^p那么如果有x的倍数的这个分子,那么约掉的就不只是x^p了,我门就这样逐步找知道最小的x的次方个数不被x整除,即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const LL M=1000000007;
LL num[100005];
LL Qmod(LL a,LL b)
{
LL ret=1;
while(b)
{
if(b&1) ret=ret*a%M;
a=a*a%M;
b>>=1;
}
return ret;
}
int main()
{
LL x,n,sum,ans;
while(scanf("%lld%lld",&n,&x)!=EOF)
{
sum=0;
for(LL i=1;i<=n;i++)
{
scanf("%lld",&num[i]);
sum+=num[i];
}
ans=sum-num[n];
for(LL i=num[n],cnt=0;i>0;i--)
{
while(n&&num[n]==i)
{
n--;cnt++;
}
if(cnt%x) break;
ans++;
cnt/=x;
}
printf("%lld\n",Qmod(x,ans));
}
}