传送门
题意
求一个数n(1≤n≤1015)的第k(1≤n≤109)个因子.
思路
一个数的因子都是成对出现的,所以只要遍历$\sqrt{n}$,用两个数组保存因子
div1数组是升序
div2数组是降序
注意
- 注意判断一个下平方数,因为会使div1的最后一个元素和div2的最后一个元素重复
- 数字较大,判断平方数的时候注意精度损失
代码
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; } }
|