1. 程式人生 > 實用技巧 >CodeForces - 900D Unusual Sequences 數論,莫比烏斯反演 容斥

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); }