题意:
给你a0,a1,b0,b1,问你 g c d ( x , a 0 ) = a 1 , l c m ( x , b 0 ) = b 1 , 有 多 少 个 x 满 足 条 件 gcd(x,a0)=a1,lcm(x,b0)=b1,有多少个x满足条件 gcd(x,a0)=a1,lcm(x,b0)=b1,有多少个x满足条件。
思路:
先看 g c d ( x , a 0 ) = a 1 gcd(x,a0)=a1 gcd(x,a0)=a1这个式子,x可以被拆分为数个质数,a0同理,那么它俩的gcd就应该为公共质因数的乘积,也就是说 x / a 1 x/a1 x/a1和 a 0 / a 1 a0/a1 a0/a1没有公共质因数,即 g c d ( x / a 1 , a 0 / a 1 ) = 1 gcd(x/a1,a0/a1)=1 gcd(x/a1,a0/a1)=1,至此,我们找到了x要满足的第一个条件:
g c d ( x / a 1 , a 0 / a 1 ) = 1 并 且 x 是 a 1 的 倍 数 gcd(x/a1,a0/a1)=1并且x是a1的倍数 gcd(x/a1,a0/a1)=1并且x是a1的倍数
紧接着来看第二个式子 l c m ( x , b 0 ) = b 1 lcm(x,b0)=b1 lcm(x,b0)=b1,同理,我们也可以得出: g c d ( b 1 / x , b 1 / b 0 ) = 1 gcd(b1/x,b1/b0)=1 gcd(b1/x,b1/b0)=1,于是得到了约束x的第二个条件:
g c d ( b 1 / x , b 1 / b 0 ) = 1 gcd(b1/x,b1/b0)=1 gcd(b1/x,b1/b0)=1
然后在 b 1 的 复 杂 度 内 枚 举 x 即 可 \sqrt{b1}的复杂度内枚举x即可 b1的复杂度内枚举x即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int t;
cin>>t;
while(t--)
{
int a0,a1,b0,b1;
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
int a = a0/a1,b = b1/b0;
int ans = 0;
int x = 1;
while(x*x <= b1)
{
if(x%a1 == 0 && b1%x == 0)
if(__gcd(x/a1,a0/a1) == 1 && __gcd(b1/x,b1/b0) == 1)
ans++;
if(b1%x == 0)
{
int k = b1/x;
if(k%a1 == 0 && b1%k == 0 && x != k)
if(__gcd(k/a1,a0/a1) == 1 && __gcd(b1/k,b1/b0) == 1)
ans++;
}
x++;
}
cout<<ans<<endl;
}
}