显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxn=5000;
int cun[maxn],cnt,tot,n;
int a,a0,b,b0;
void Devide(int x)
{
for(int i=1;i<=sqrt(x);i++)
{
if(x%i==0)
{
if(i!=1)
{
cun[++tot]=i;
}
if(x/i!=1&&x/i!=i)cun[++tot]=x/i;//平方加一个;
}
}
}
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
/*
2
10 10 10 10
5 1 2 10
ans 1 0
*/
/*
10
90 2 9 18
73 1 98 196
61 1 75 300
21 1 17 1003
80 1 42 3738
72 18 47 2538
20 4 18 252
43 1 63 504
60 4 66 264
44 1 23 897
*/
/*
3
6
2
4
2
3
6
2
2
*/
freopen("son.in","r",stdin);freopen("son.out","w",stdout);
int T;
cin>>T;
while(T-->0)
{
scanf("%d%d%d%d",&a,&a0,&b,&b0);
/*
1. x 和 a 的最大公约数是 a0;
2. x 和 b 的最小公倍数是 b0。
*/
memset(cun,0,sizeof(cun));
tot=0;
cnt=0;
Devide(b);//分解b质因数;
int bob=b0/b;//储存b0为b的几倍;
int gy=gcd(bob,b);//GY储存公约数;
int gb=bob/gy*b;//GB储存公倍数;
if( b%bob || b==bob || b==b0)
{
if( gcd(bob,a)==a0 && gb==b0)
{
cnt++;
}
}
for(int i=1;i<=tot;i++)
{
int tp=cun[i]*bob;
int Gy=gcd(tp,a);
if(Gy!=a0)continue;
Gy=gcd(b,tp);
int Gb=tp/Gy*b;
if(Gb==b0)
{
if( b%tp || (b==tp&&b0==b) || b==b0 )
{
cnt++;
}
}
}
printf("%d\n",cnt);
}
}