嗯...通过标签我们易得知,这是一道数学题(废话)
其中,题目给了这两个条件:
(gcd(x,a_0)=a_1,lcm(x,b_0)=b_1)
所以,根据 (gcd) 与 (lcm) 的性质,我们可以得到如下结论:
(a_1|x,x|b_1) , ({x} over a_1) 与 (a_0 over a_1) 互质, (b_1 over x) 与 (b_1 over b_0) 互质。
(请自行思考原因)
有了这个结论,接下来的枚举就十分简单了。直接枚举 (b_1) 所有的因数,然后判断、累加答案即可。
代码时间:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int ans,n,a0,a1,b0,b1;
//gcd(x/a1,a0/a1)=1,gcd(b1/x,b1/b0)=1
int gcd(int x,int y){
return x==0?y:gcd(y%x,x);
}
int main(){
cin>>n;
while(n--){
ans=0;
scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
int i=a0/a1,j=b1/b0;
for(int u=1;u*u<=b1;u++){
if(b1%u==0){
int v=b1/u;
if(u!=v){
if(u%a1==0&&gcd(u/a1,i)==1&&b1%u==0&&gcd(b1/u,j)==1) ans++;
if(v%a1==0&&gcd(v/a1,i)==1&&b1%v==0&&gcd(b1/v,j)==1) ans++;
}
else{//注意此处,有可能枚举的u=v,并且两者都满足条件,就重复累加了ans,所以需特殊判断
if(u%a1==0&&gcd(u/a1,i)==1&&b1%u==0&&gcd(b1/u,j)==1) ans++;
}
}
}
cout<<ans<<endl;
}
return 0;
}
蒟蒻第一次写博客,请大佬多多指教!