【题解】洛谷P1072 Hankson的趣味题 (gcd和lcm的应用)

洛谷P1072:https://www.luogu.org/problemnew/show/P1072

思路

gcd(x,a0)=a1

lcm(x,b0)=b1→b0*x=b1*gcd(x,b0) (由a*b=gcd(a,b)*lcm(a,b))

x=(b1/b0)*gcd(x,b0)

令i=gcd(x,b0)∈[1,√b0] 分成两半求减少时间复杂度 特判相等的时候

判断x=(b1/b0)*i和x=(b1/b0)*(b0/i)是否满足条件

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,a0,a1,b0,b1,ans;
int gcd(int a,int b)
{
    if(b==0) return a;
    else
    return gcd(b,a%b);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d%d",&a0,&a1,&b0,&b1);
        ans=0;
        if(b1%b0!=0)//不是整数 
        {
            cout<<0<<endl;
            continue;
        }
        for(int j=1;j*j<b0;j++)//枚举j=gcd(x,b0) 枚举一半即可 
        {
            if(b0%j==0)
            {
                int x=b1/b0*j;//公约数为j 
                if(gcd(x,b0)==j&&gcd(x,a0)==a1)
                ans++;
                x=b1/b0*(b0/j);//公约数为b0/j 
                if(gcd(x,b0)==b0/j&&gcd(x,a0)==a1)
                ans++;
            }
        }
        int k=int(sqrt(b0));//特殊情况 两者相等 
        if(k*k==b0)
        {
            int x=b1/b0*k;
            if(gcd(x,b0)==k&&gcd(x,a0)==a1)
            ans++;
        }
        cout<<ans<<endl;
    }
}
View Code

 

posted @ 2018-09-16 16:34  Nanchtiy  阅读(165)  评论(0编辑  收藏  举报