题解:P1072 [NOIP2009 提高组] Hankson 的趣味题
显然直接暴力不行,复杂度
我们发现,
但是
温馨提示:
- C++ 里求最大公因数的函数是
__gcd(),__gcd(x,y)是求x 和y 的最大公因数。 -
\operatorname{lcm}(x,y)= \dfrac{xy}{\gcd(x,y)}
#include<bits/stdc++.h>
using namespace std;
int T;
int main(){
cin>>T;
for(int o=1;o<=T;o++){
int ans=0;
int a0,a1,b0,b1;
cin>>a0>>a1>>b0>>b1;
int qq=(int)sqrt(b1);
for(int i=1;i<=qq;i++){
//注意 if 的顺序
if(b1%i==0&&b1/i==i){
//注意:求最小公倍数时,先除后乘,防止溢出。
if(__gcd(i,a0)==a1&&i/__gcd(i,b0)*b0==b1) ans++;
break;
}
else if(b1%i==0){
if(__gcd(i,a0)==a1&&i/__gcd(i,b0)*b0==b1){
ans++;
}
if(__gcd(b1/i,a0)==a1&&(b1/i)/__gcd(b1/i,b0)*b0==b1){
ans++;
}
}
}
cout<<ans<<'\n';
}
return 0;
}