传送门

题意

求一个数n(1≤n≤1015)的第k(1≤n≤109)个因子.

思路

一个数的因子都是成对出现的,所以只要遍历$\sqrt{n}$,用两个数组保存因子
div1数组是升序
div2数组是降序

注意

  1. 注意判断一个下平方数,因为会使div1的最后一个元素和div2的最后一个元素重复
  2. 数字较大,判断平方数的时候注意精度损失

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <cmath>
#define MAXN 100005
#define LL long long
using namespace std;
LL div1[MAXN];
LL div2[MAXN];
int cnt;
LL n;
int k;
int flag;
int main(){
while(scanf("%lld %d",&n,&k)!=EOF){
cnt = 0;
flag = 0;
for(int i = 1;i<=sqrt((double)n);i++){
if(n%i==0){
div1[++cnt]=i;
div2[cnt]=n/i;
}
}
if((LL)sqrt(n)*(LL)sqrt(n)==n)//判断是不是平方数
flag = 1;
if(flag && k>2*cnt-1){
cout << "-1" << endl;
continue;
}
if(k<=cnt)
cout<<div1[k]<<endl;
else if(k<=2*cnt && !flag)
cout<<div2[cnt-(k-cnt)+1]<<endl;
else if(k<=2*cnt && flag)
cout<<div2[cnt-(k-cnt)]<<endl;
else
cout<<"-1"<<endl;
}
}
//99999999994190 9
//241656799

留言

2017-01-27

⬆︎TOP