本文主要是介绍因子化简——CSP认证题目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题描述
小 P 同学在学习了素数的概念后得知,任意的正整数 n都可以唯一地表示为若干素因子相乘的形式。如果正整数 n有m 个不同的素数因子 p 1 , p 2 , … , p m p_1, p_2, \ldots, p_m p1,p2,…,pm,则可以表示为: n = p 1 t 1 ⋅ p 2 t 2 ⋅ p 3 t 3 ⋯ p m t m n = p_1^{t_1} \cdot p_2^{t_2} \cdot p_3^{t_3} \cdots p_m^{t_m} n=p1t1⋅p2t2⋅p3t3⋯pmtm 。
小 P 认为,每个素因子对应的指数 t i t_{i} ti 反映了该素因子对于 n的重要程度。现设定一个阈值 k,如果某个素因子 pi对应的指数 t i t_{i} ti小于 k,则认为该素因子不重要,可以将 p i t i p_i^{t_i} piti 项从 n 中除去;反之则将 p i t i p_i^{t_i} piti 项保留。最终剩余项的乘积就是 n简化后的值,如果没有剩余项则认为简化后的值等于1。
试编写程序处理 q个查询:
每个查询包含两个正整数 n 和 k,要求计算按上述方法将 n 简化后的值。
输入格式
从标准输入读入数据。
输入共 q+1 行。
输入第一行包含一个正整数 q,表示查询的个数。
接下来 q 行每行包含两个正整数 n 和 k,表示一个查询。
输出格式
输出到标准输出。
输出共 q行。
每行输出一个正整数,表示对应查询的结果。
样例输入
3
2155895064 3
2 2
10000000000 10
样例输出
2238728
1
10000000000
def simplify_number(n, k):"""将正整数 n 按照阈值 k 简化后的值"""result = 1i = 2while i * i <= n:if n % i == 0:count = 0while n % i == 0:n //= icount += 1if count >= k: # 只保留指数不小于 k 的素数因子result *= i ** counti += 1if n > 1 and k==1: # 处理最后一个素数因子,因为最后一个素数因子指数肯定为1,所以只有k为1时才保留result *= nreturn result# 读取查询个数
q = int(input())# 存储查询数据
queries = []
for _ in range(q):n, k = map(int, input().split())queries.append((n, k))# 处理每个查询并输出结果
results = []
for query in queries:n, k = queryresult = simplify_number(n, k)results.append(result)# 输出结果
for result in results:print(result)
解题思路:
以上代码的核心思路如下:
- 定义一个函数
simplify_number(n, k)
,用于将正整数 n 按照阈值 k 进行简化。 - 在主循环中,从最小的素数 2 开始遍历,直到 i * i 大于 n。如果 n 能够整除当前的素数 i,则统计该素数在 n 中的指数 count。
- 如果 count 大于等于 k,则将当前素数及其指数乘入结果中。
- 处理完所有小于 sqrt(n) 的素数后,如果 n 大于 1 且 k 等于 1,则将剩余的 n 乘入结果中。
- 对每个查询,读取输入的 n 和 k,并调用
simplify_number(n, k)
函数,将结果存入列表中。 - 最后,输出所有结果。
这篇关于因子化简——CSP认证题目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!