Loading

CodeForces - 900D Unusual Sequences 数论,莫比乌斯反演 容斥

给定 x ,y

问有多少个k元组使得其gcd = x, sigma = y , k随意

首先进行转化,相当于 有多少个k元组满足 gcd = 1,sigma  = y / x 。

因此容易得出 y % x  != 0 时,输出0

现在相当于计算有多少个gcd = 1 的组 使得sigma = y / x 。对于这样直接求是不好求的,但是对于不要求gcd = 1 的组数 g(x) 是好求的。

莫比乌斯反演即可。

ll getu(ll x) {
    ll v = 1;
    for (ll i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            v = -v, x /= i;
            if (x % i == 0) return 0;
        }
    }
    if (x != 1) v = -v;
    return v;
}

int main() {
    ll x = readll(), y = readll();
    if (y % x) {
        puts("0");
        return 0;
    }
    x = y / x;
    ll res = 0;
    for (ll i = 1; i * i <= x; i++) {
        if (x % i) continue;
        res = (MOD + res +  getu(i) * (quickPower(2ll,x / i - 1,MOD))) %MOD;
        if (i * i != x) res = (MOD + res + getu(x / i) * (quickPower(2ll,i - 1,MOD))) % MOD;
    }
    Put(res);
}

 

posted @ 2020-08-08 19:00  MQFLLY  阅读(96)  评论(0编辑  收藏  举报