====== K번째 수 ====== ===== 풀이 ===== * N개의 수가 주어졌을때, X보다 작은 수의 갯수를 세는 것이 O(T)에 가능하다면, K번째 수는 파라메트릭 서치를 이용해서 O(TlogN)에 찾을 수 있다. K번째 수는 'a_1, ..., a_N 중에서, a_i보다 작은 수의 갯수가 K-1개 이상인 가장 작은 a_i' 로 표현할 수 있기 때문이다. * 이 테크닉을 사용하는 대표적인 다른 예시로 [[ps:구간 쿼리]]가 있다. 머지소트트리를 사용해서 X보다 작은 수의 갯수를 O(log^2(n))에 셀 수 있고, 이것을 이진탐색으로 반복해서 O(log^3(n))에 구간 내 K번째 수를 찾을 수 있다. * 여기서도 같은 방법을 사용한다. i*j로 만들어질수 있는 수 중에서 X보다 작은 수의 갯수를 세는 것은, i를 1,2,...,N으로 증가시키면서 i*j """Solution code for "BOJ 1300. K번째 수". - Problem link: https://www.acmicpc.net/problem/1300 - Solution link: http://www.teferi.net/ps/problems/boj/1300 """ from teflib import algorithm def main(): def is_greater_than_k_nums(num): low = (num - 1) // N smaller_num_count = low * N smaller_num_count += sum((num - 1) // i for i in range(low + 1, N + 1)) return smaller_num_count >= k N = int(input()) k = int(input()) print(algorithm.binary_search(0, k + 10, is_greater_than_k_nums) - 1) if __name__ == '__main__': main() * Dependency: [[:ps:teflib:algorithm#binary_search|teflib.algorithm.binary_search]] {{tag>BOJ ps:problems:boj:골드_3}}