思路: 根据题意,a 和 b 的最大公约数是 x,最小公倍数是 y,可以得出以下结论:

  1. a 和 b 的最大公约数是 x,说明 x 是 a 和 b 的公约数,即 a 和 b 能够被 x 整除。
  2. a 和 b 的最小公倍数是 y,说明 y 是 a 和 b 的倍数,即 a 和 b 能够整除 y。
  3. a 和 b 的最大公约数是 x,那么 a 和 b 的公约数一定是 x 的因数。
  4. a 和 b 的最小公倍数是 y,那么 a 和 b 的倍数一定是 y 的倍数。
  5. 由于 a 和 b 的最大公约数是 x,最小公倍数是 y,那么 a 和 b 的乘积一定是 x * y。

根据以上结论,我们可以得到求解的方法:

  1. 首先,找出所有满足条件 1 的数对 (a, b),即 a 和 b 能够被 x 整除。
  2. 然后,对于每一个满足条件 1 的数对 (a, b),判断是否满足条件 2,即 a 和 b 能够整除 y。
  3. 统计满足条件 2 的数对的数量,即为所求。

代码如下:

def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

def lcm(a, b):
    return a * b // gcd(a, b)

def count_pairs(x, y):
    count = 0
    for a in range(x, y + 1, x):
        if lcm(a, y) == y:
            count += 1
    return count

x, y = map(int, input().split())
result = count_pairs(x, y)
print(result)

复杂度分析:

  1. 求解最大公约数 gcd 的时间复杂度为 O(log(min(a, b))),最小公倍数 lcm 的时间复杂度为 O(log(min(a, b)))。
  2. 对于每一个满足条件 1 的数对 (a, b),判断是否满足条件 2 的时间复杂度为 O(1)。
  3. 因此,总的时间复杂度为 O(y/x)。
Python3 编写求解整数对数量的程序

原文地址: https://www.cveoy.top/t/topic/qc5t 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录