📅  最后修改于: 2023-12-03 14:46:49.432000             🧑  作者: Mango
给定一个正整数 $n$,找到所有满足下面条件的两个整数 $(a, b)$:
请你根据给定的 $n$ 返回符合条件的整数对的数量。
输入:$n = 5$
输出:$2$
解释:符合条件的两个整数对为 $(1, 2)$ 和 $(2, 3)$。
首先,对于整数对 $(a, b)$,如果 $a$ 除以 $b$ 的结果与 $b$ 除以 $a$ 的结果是整数,那么有:
$$ \frac{a}{b} = k \Leftrightarrow a = kb \ \frac{b}{a} = l \Leftrightarrow b = la $$
其中,$k$ 和 $l$ 都是正整数。代入互质的条件,有:
$$ \gcd(a, b) = 1 \Leftrightarrow \gcd(k, l) = 1 $$
因此,对于一个正整数 $n$,我们可以枚举所有 $1 \leq a < b < n$ 的整数对 $(a, b)$,并检查它们是否互质,如果互质,则计算它们的商 $k = \lfloor \frac{a}{b} \rfloor$,判断条件是否成立即可。
代码实现如下:
def gcd(a, b):
"""
计算 a 和 b 的最大公约数
"""
if b == 0:
return a
return gcd(b, a % b)
def count_pairs(n):
"""
统计符合条件的整数对的数量
"""
count = 0
for a in range(1, n):
for b in range(a + 1, n):
if gcd(a, b) == 1:
k = a // b
l = b // a
if k == l:
count += 1
return count
时间复杂度为 $O(n^2 \log n)$,空间复杂度为 $O(1)$。
本题是一道比较简单的数学问题,可以通过列方程和暴力枚举的方法解决。需要注意的是,在计算两个整数的最大公约数时,可以使用欧几里得算法快速计算。