📌  相关文章
📜  国际空间研究组织 | ISRO CS 2013 |问题 50(1)

📅  最后修改于: 2023-12-03 15:07:34.061000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2013 |问题 50

这是一道ISRO CS 2013考试的编程题,需要求解一个数学问题。

题目描述

给定一个正整数N,计算所有2 <= i <= N 以及 2 <= j <= N,并且满足(i + j)的最高质因子是5的(i, j)对的数量。例如,如果N = 15,那么这样的(i, j)对为:(2, 3), (2, 8), (2, 13), (3, 2), (3, 7), (3, 12), (4, 5), (4, 10), (5, 2), (5, 8), (5, 13), (7, 3), (7, 12), (8, 2), (8, 5), (8, 13), (10, 4), (10, 11), (11, 10), (12, 3), (12, 7), (13, 2), (13, 5), 和 (13, 8),因此答案为 24。

输入

一个整数N(2 <= N <= 10000)

输出

一个整数,表示所有(i, j)对的数量。

代码实现
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def highest_prime_factor(n):
    i = 5
    while i * i <= n:
        if n % i == 0:
            n //= i
        else:
            i += 2 if i > 5 else 4
    return n

def main():
    n = int(input())
    count = 0
    for i in range(2, n + 1):
        for j in range(2, n + 1):
            if highest_prime_factor(i + j) == 5:
                count += 1
    print(count)

if __name__ == '__main__':
    main()
解题思路

这道题需要枚举所有的 (i, j) 对,判断它们相加的最高质因子是否为 5。

为了判断一个数的最高质因子是否为 5,可以使用 highest_prime_factor 函数。该函数使用了一种叫做试除法(trial division)的算法,从 5 开始试除,以 2、4、2、4、2、4、…… 的方式不断尝试相邻的两个质数。

对于每一个满足条件的 (i, j),都将计数器 count 加 1,最后输出 count 即可。

需要注意的是,在高效实现代码的时候,可以使用技巧将高频访问的对于质数的判定和对于5的最高质因子判断缓存好。