传送门
很有意思的题目
首先分母是(x^{a_1+a_2+...+a_n}),
分子是(x^{a_2 + a_3+...+a_n} + x^{a_1+a_3+...+a_n} + ... + x^{a_1+a_2+...+a_n})
那么gcd肯定是幂里面的最小值,对于分母的最小gcd是(a_1+a_2+...+a_n)
对于分子来说,每一块的最小gcd是(sum - a[i])
考虑到不同快的幂次可能相同,而(x)个相同块可以使得幂加1,那么就用map去记录每一块的大小,然后小的尽可能去合并,最后统计最小的那个值即可
ll a[N];
void solve(int kase){
int n, x; _(n), _(x);
ll sum = 0;
rep(i, 1, n) IO::read(a[i]), sum += a[i];
ll mi = sum;
std::map<ll, ll> mp;
for(int i = 1; i <= n; i++) {
mp[sum - a[i]]++;
}
for(auto &xx : mp) {
if(xx.se / x) mp[xx.fi + 1] += xx.se / x;
xx.se -= xx.se / x * x;
if(xx.se) mi = min(mi, xx.fi);
}
printf("%lld
", pow(x, mi, MOD));
}