作者:
navystar
,
2023-05-26 12:09:20
,
所有人可见
,
阅读 3
//这里填你的代码^^
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 5e5 + 10, M = 150;
struct node
{
int p, s;
}factor[N];
int primes[N], cnt;
bool st[N];
int cntf, divide[N], cntd;
inline int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
inline void get(int x)
{
for (int i = 2; i <= x; i ++ )
{
if (!st[i]) primes[cnt ++] = i;
for (int j = 0; primes[j] * i <= x; j ++ )
{
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
inline void dfs(int u, int p)
{
if (u > cntf)
{
divide[cntd ++] = p;
return;
}
for (int i = 0; i <= factor[u].s; i ++ )
{
dfs(u + 1, p);
p *= factor[u].p;
}
}
inline void solve()
{
int n;
cin >> n;
while (n --)
{
int a0, a1, b0, b1;
cin >> a0 >> a1 >> b0 >> b1;
int d = b1;
cntf = 0;
for (int i = 0; primes[i] <= d / primes[i]; i ++ )
{
int p = primes[i];
if (d % p == 0)
{
int s = 0;
while (d % p == 0) d /= p, s ++;
factor[++ cntf] = {p, s};
}
}
if (d > 1) factor[++ cntf] = {d, 1};
cntd = 0;
dfs(1, 1);
int res = 0;
for (int i = 0; i < cntd; i ++ )
{
int x = divide[i];
if (gcd(x, a0) == a1 && (long long) x * b0 / gcd(x, b0) == b1) res ++;
}
cout << res << endl;
}
}
int main()
{
cin.tie(nullptr) -> sync_with_stdio(0);
get(N);
solve();
return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~