吐槽自己 : 从上次青岛区域赛回来自己的做题时间约等于零,发现自己变得超级菜啊,最近要找找手感要不ec 要凉了啊
题意 :很容易理解 不说了
题解 : 首先如果 y 不能整除 x 肯定无解,这就是唯一的一种无解的情况,下面说有解的情况,就是y 整除 x ,在y 整除 x的情况下,有多少解呢 ?思想就是对 y / x的质因数进行容斥,用全部的减去不符合条件的,利用状态压缩思想进行二进制枚举就好了。具体细节看代码好了
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;
const int maxn = 1005;
int p[maxn] = {0};
ll lpow (ll a,ll b) {
if (b == 0) return 1;
ll res = lpow (a,b / 2) % mod;
res = res * res % mod;
if (b % 2) res = res * a % mod;
return res % mod;
}
int main() {
ios_base :: sync_with_stdio(false);
ll a,b;
cin >> a >> b;
if (b % a) {
cout << 0 << endl;
return 0;
}
ll y = b / a;
ll yy = y;
int cnt = 0;
for (ll i = 2;i * i <= y; ++ i) {
if (y % i) continue;
p[cnt ++] = i;
while (y % i == 0) y /= i;
}
if (y > 1) p[cnt ++] = y;
ll res=0;
for (int i = 0;i < (1 << cnt); ++ i) {
ll temp = 1;
int c = 0;
for (int j = 0;j < cnt; ++ j) {
if ((1 << j) & i) {temp *= p[j];c ++;}
}
if (c % 2) {
res -= lpow(2ll, yy / temp - 1ll);
}
else res += lpow (2ll,yy / temp - 1ll);
res = (res + mod) % mod;
}
cout << res % mod << endl;
return 0;
}