zoukankan      html  css  js  c++  java
  • Luogu P1072 Hankson 的趣味题

    题目大意

      已知正整数$a_{0}$、$a_{1}$、$b_{0}$、$b_{1}$($1 leq a_{0}, a_{1}, b_{0}, b_{1} leq 2 imes 10^{9}$),设某未知正整数$x$满足:

    1.  $x$和$a_{0}$的最大公约数是$a_{1}$;
    2.  $x$和$b_{0}$的最小公倍数是$b_{1}$

      请你求出有多满足条件的$x$。

    题解

      方法有很多,这里给一种比较暴力的解法。

      $$ecause  x imes b_{0} = gcd(x, b_{0}) imes b_{1} \ herefore x = frac{b_{1}}{b_{0}} imes gcd(x, b_{0})$$

      我们只需要用$O(sqrt{b_{0}})$的时间枚举$gcd(x, b_{0})$,然后判断是否满足条件即可。

    #include <iostream>
    
    using namespace std;
    
    int n;
    int a0, a1, b0, b1;
    int ans;
    
    int gcd(int a, int b)
    {
        int c;
        while(b)
        {
            c = a % b;
            a = b;
            b = c;
        }
        return a;
    }
    
    long long lcm(int a, int b)
    {
        return (long long)a * b / gcd(a, b);
    }
    
    int main()
    {
        cin >> n;
        int x;
        while(n--)
        {
            cin >> a0 >> a1 >> b0 >> b1;
            ans = 0;
            for(int i = 1; i * i <= b0; ++i)
            {
                if(b0 % i) continue;
                x = b1 / b0 * i;
                if(gcd(x, a0) == a1 && lcm(x, b0) == b1) ++ans;
                if(b0 / i == i) continue;
                x = b1 / b0 * b0 / i;
                if(gcd(x, a0) == a1 && lcm(x, b0) == b1) ++ans;
            }
            cout << ans << "
    ";
        }
        return 0;
    }
    参考程序
  • 相关阅读:
    Date类型 方法
    迭代方法和归并函数
    js快速排序方法
    reset
    水平垂直居中
    css清除浮动
    box-shadow
    display---我的第一篇博客
    centos7基础安装
    aws和ufile挂载数据盘EBS
  • 原文地址:https://www.cnblogs.com/kcn999/p/11277801.html
Copyright © 2011-2022 走看看