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