cf359 C. Prime Number - 唯一分解定理 + gcd

传送门
很有意思的题目
首先分母是\(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\n", pow(x, mi, MOD));
}
posted @ 2021-01-10 16:16  Emcikem  阅读(90)  评论(0编辑  收藏  举报