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

 

posted @ 2018-08-12 22:23  lcan  阅读(155)  评论(0编辑  收藏  举报