https://www.luogu.org/problem/show?pid=1072
首先关于最大公约数和最小公倍数的一个很重要的定理:
gcd(a,b)∗lcm(a,b)=a∗b
这个东西在这里是个很有用的东西
我们来推一下公式:
x 和
继续转化公式得: gcd(x,b0)=x∗b0/b1
从这里发现 x∗b0/b1 是两者的公约数
继续: gcd(x/(x∗b0/b1),b0/(x∗b0/b1))=1
化简一下: gcd(b1/b0,b1/x)=1
关于 a 也是一样的
然后发现
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++){
ll ans=0;int a0,a1,b0,b1;scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
for(int j=1;j*j<=b1;j++)if(b1%j==0){
if(j%a1==0)ans+=(gcd(j/a1,a0/a1)==1&&gcd(b1/b0,b1/j)==1);
int k=b1/j;
if(k!=j&&k%a1==0)ans+=(gcd(k/a1,a0/a1)==1&&gcd(b1/b0,b1/k)==1);
}
printf("%lld\n",ans);
}
return 0;
}