Hankson的趣味题 未完待续
gcd(x,a0)=a1 lcm(x,b0)=b1 枚举x
(x*b0)/gcd(x,b0)=b1 -> x=(b1/b0)*gcd(x,b0) 枚举gcd(x,b0),gcd(x,b0)是b0的一个约数 -> 枚举b0的约数
注意b0是完全平方数时要特判
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int x,ans,a0,a1,b0,b1; int gcd(int a,int b){ if(b==0) return a; return gcd(b,a%b); } int main(){ int n;cin>>n; while(n--){ ans=0; cin>>a0>>a1>>b0>>b1; if(b1%b0!=0){ cout<<0<<endl; continue; } for(int i=1;i<sqrt(b0);i++){ if(b0%i==0){ x=b1/b0*i; if(gcd(x,b0)==i&&gcd(x,a0)==a1) ans++; x=b1/b0*(b0/i); if(gcd(x,b0)==b0/i&&gcd(x,a0)==a1) ans++; } } int k=sqrt(b0);//如果放到上面去,相同的一个数会多加一次 if(k*k==b0&&b0%k==0){ x=b1/b0*k; if(gcd(x,b0)==k&&gcd(x,a0)==a1) ans++; } cout<<ans<<endl; } return 0