Codeforces 762A k-th divisor
2017-01-26 08:37
246 查看
题目链接:http://codeforces.com/contest/762/problem/A
题意:
让你找到第 k 小的 n 的约数,没有输出 -1。
题解:
看到数据范围就明白暴搜会挂,sqrt 似乎能卡过去,来写一发?
交上去 Duang 超时了。。 超时代码
发现代码中只用了一个 vector,导致vector中的元素无序,所以用了个 sort,就超时了。
那我能不能用两个vector呢?一个存储 sqrt(n) 以前的因数(包括 sqrt(n)),一个存储 sqrt(n) 以后的因数。
这样的话,第一个vector 为正序,第二个为倒序。
输出的时候直接分情况处理就可以了。
注意:这里的变量千万别只用int,譬如第一个求因数的循环变量,如果用int的话,到最后会炸,然后就死循环了 = =b
代码:
题意:
让你找到第 k 小的 n 的约数,没有输出 -1。
题解:
看到数据范围就明白暴搜会挂,sqrt 似乎能卡过去,来写一发?
交上去 Duang 超时了。。 超时代码
发现代码中只用了一个 vector,导致vector中的元素无序,所以用了个 sort,就超时了。
那我能不能用两个vector呢?一个存储 sqrt(n) 以前的因数(包括 sqrt(n)),一个存储 sqrt(n) 以后的因数。
这样的话,第一个vector 为正序,第二个为倒序。
输出的时候直接分情况处理就可以了。
注意:这里的变量千万别只用int,譬如第一个求因数的循环变量,如果用int的话,到最后会炸,然后就死循环了 = =b
代码:
#include <cstdio> #include <vector> using namespace std; typedef long long LL; vector<LL> v1, v2; LL n, k; #define pb push_back int main() { scanf("%I64d %I64d", &n, &k); for ( LL i = 1; i*i <= n; i ++ ) { if(n%i == 0) { if(i*i == n) v1.pb(i); else { v1.pb(i); v2.pb(n/i); } } } LL tot = (LL)v1.size()+(LL)v2.size(); if(tot < k) { puts("-1"); return 0; } if(k > v1.size()) printf("%I64d\n", v2[v2.size()-(k-v1.size()-1)-1]); else printf("%I64d\n", v1[k-1]); return 0; }
相关文章推荐
- CodeForces 762A k-th divisor
- Codeforces 762A k-th divisor
- codeforces 762A k-th divisor
- CodeForces - 762A k-th divisor (数学
- CodeForces - 762A k-th divisor
- Codeforces 762A-k-th divisor
- 【Codeforces 762A】 k-th divisor
- codeforces-762A k-th divisor(数学题)
- 【codeforces 762A】k-th divisor
- 762A k-th divisor
- CodeForces510 C. Fox And Names(拓扑排序)
- 【CodeForces 297C】Splitting the Uniqueness
- codeforces 703E
- codeforces 777D. Cloud of Hashtags (逆序思维)
- Codeforces 839C Journey
- Codeforces - 920G - List Of Integers
- Codeforces 242B
- Codeforces 633B A Trivial Problem 【数论】
- codeforces-508C -鬼吹灯(巧妙模拟)
- The Union of k-Segments CodeForces - 612D 什么技巧还有数据结构