Codeforces 762A k-th divisor

题目链接: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

 

代码:

 

#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;
}

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值