1. 问题描述:
给定两个整数 n 和 k,请你找到并输出能够整除 n 的第 k 小的正整数。
输入格式
一行,两个整数 n 和 k。
输出格式
输出能够整除 n 的第 k 小的整数。如果不存在,则输出 −1。
数据范围
1 ≤ n ≤ 10 ^ 15,
1 ≤ k ≤ 10 ^ 9。
输入样例1:
4 2
输出样例1:
2
输入样例2:
5 3
输出样例2:
-1
来源:https://www.acwing.com/problem/content/description/3786/
2. 思路分析:
首先需要搞清楚一个概念,x能够被n整除为:x % n == 0,x能整除n为:n % x == 0,而题目中需要求解的是x能够整除n,所以为n % x == 0,也即需要求解出n的所有约数,因为n最大是10 ^ 15而试除法求解n的所有约数时间复杂度为O(√10 ^ 15) = O(3 * 10 ^ 7),所以应该是可以通过的,在试除法求解所有约数的过程中将约数存储到d中最终排序返回相应的结果即可。
3. 代码如下:
class Solution:
def process(self):
n, k = map(int, input().split())
# 试除法求解所有的约数
i = 1
d = list()
while i <= n // i:
if n % i == 0:
d.append(i)
# 不能够相等
if n // i != i:
# 另外一个数字也是约数
d.append(n // i)
i += 1
# 超出了边界返回-1
if k > len(d): return -1
# 排序之后第k个约数就是答案
d.sort()
return d[k - 1]
if __name__ == '__main__':
print(Solution().process())