zoukankan      html  css  js  c++  java
  • 【题解】洛谷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
  • 相关阅读:
    CPU运行原理
    ucore代码分析
    ThreadLocal是否会导致内存泄露
    2018 多校联合训练 4
    2018 多校联合训练 3
    2018 牛客多校 4
    2018 牛客多校 3
    2018 牛客多校 2
    2018 牛客多校 1
    2018 多校联合训练 2
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9656497.html
Copyright © 2011-2022 走看看