CodeForces - 900D Unusual Sequences 數論,莫比烏斯反演 容斥
阿新 • • 發佈:2020-08-08
給定 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); }