cf359 C. Prime Number

传送门
很有意思的题目
首先分母是(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));
}
原文地址:https://www.cnblogs.com/Emcikem/p/14258641.html