给定两个整数 n 和 k,请你找到并输出能够整除 n 的第 k 小的正整数。
输入格式
一行,两个整数 n 和 k。
输出格式
输出能够整除 n 的第 k 小的整数。
如果不存在,则输出 −1。
数据范围
1≤n≤1015,
1≤k≤109。
输入样例1:
4 2
输出样例1:
2
输入样例2:
5 3
输出样例2:
-1
算法:
x能整除n,那么x一定是n的约数,因此可以先把n的所有约数先求出来;
这里求约数的时候,用i * i <= n 比 i <= n / i 快~
C++代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long LL;
LL n,k;
int main(){
vector<LL> res;
cin >> n >> k;
for(LL i = 1; i * i <= n; i++){
if(n%i == 0){
res.push_back(i);
if(i != n / i) res.push_back(n / i);
}
}
if(k > res.size()) cout<<-1<<endl;
else{
sort(res.begin(),res.end());
cout<<res[k-1]<<endl;
}
return 0;
}