记录
#include <bits/stdc++.h>
using namespace std;
vector <long long> v;
vector <long long> Ans;
vector <bool> bl;
long long ans;
long long a0, a1, b0, b1;
long long p()
{
long long P = 1;
for (int i = 0; i < bl.size(); i++)
if (bl[i])
P *= v[i];
return P;
}
inline long long gcd(long long a, long long b)
{
if (b)
while ((a %= b) && (b %= a));
return a + b;
}
void dfs(int x)
{
if (x > bl.size())
{
if (gcd(a0, b1 / b0 * p()) == a1 && b1 / b0 * p() * b0 / gcd(b1 / b0 * p(), b0) == b1)
{
bool f = 1;
for (long long i = 0; i < Ans.size(); i++)
if (p() == Ans[i])
{
f = 0;
break;
}
if (f)
{
Ans.push_back(p());
ans++;
}
}
return;
}
bl[x] = 1;
dfs(x + 1);
bl[x] = 0;
dfs(x + 1);
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
ans = 0;
scanf("%lld%lld%lld%lld", &a0, &a1, &b0, &b1);
long long m = b0;
v.resize(0);
for (long long j = 2; j * j <= b0; j++)
while (m % j == 0)
{
m /= j;
v.push_back(j);
}
if (m != 1)
v.push_back(m);
bl.resize(v.size());
Ans.resize(0);
dfs(0);
cout << ans << endl;
}
return 0;
}