从lcm(b,x)=dlcm(b,x)=dlcm(b,x)=d可知xxx一定整除ddd,即xxx一定是ddd的约束。通过试除法,我们可以在O(sqrt(N))O(sqrt(N))O(sqrt(N))内求出所有ddd的约数,逐一判断是否满足题意即可。
总时间复杂度O(n∗sqrt(d)∗logd)O(n*sqrt(d)*logd)O(n∗sqrt(d)∗logd)
// luogu-judger-enable-o2
#include <iostream>
using namespace std;
long long n;
long long a,b,c,d;
int tot;
long long ans[200010];
void pri(long long n)
{
for(int i=1;i*i<=n;i++)
{
if(!(n%i))
{ans[++tot]=i;
if(n/i!=i) ans[++tot]=n/i;}
}
}
long long gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
}
long long lcm(long long a,long long b)
{
return a*b/gcd(a,b);
}
int nod;
int main()
{
cin>>n;
while(n--){
tot=0;
cin>>a>>c>>b>>d;
pri(d);
nod=0;
for(int i=1;i<=tot;i++){
if(gcd(ans[i],a)==c&&lcm(ans[i],b)==d){
nod++;
}
}
cout<<nod<<endl;
}
}