알고리즘

NN단표

Chars4785 2019. 5. 10. 18:14

문제


알랩이는 구구단표처럼 NN단표를 만들었다고 한다.

NN단표는 2차원 배열의 모양으로 곱셈 1단부터 N단까지의 값들을 적어놓은 형태이다.

NN단표의 배열을 A라고 했을 때, 배열의 들어가는 수 A[i][j]=i*j이다.(즉, 4행 7열에는 28, 7행 5열에는 35가 들어가 있다.)

알랩이는 N단까지 나온 숫자들 중에서 K번째로 작은 수를 찾고 싶어한다.

이때, 중복되는 여러 수들을 고려한다. 즉 N*N개의 모든 수들 중에서 K번째 수를 구하는 것이다.  

입력


첫째 줄에 배열의 크기 N이 주어진다. N은 100,000보다 작거나 같은 자연수이다. 둘째 줄에 K가 주어진다. K는 N*N보다 작거나 같은 자연수이다.  

출력


K번째 원소를 출력한다.

 

예제 입력

3 7

예제 출력

6

#include <iostream>
 
using namespace std;

long long N;
long long result =10000000000;


void binarySearch(long long start, long long end, long long find){ //1,9,7
    if(start > end){ 
        return;
    }
    
    long long mid = (start+end)/2;
    long long cnt=0;
    for(long long i = 1 ; i <= N ; i++){
        
        long long num = mid/i;
        
        if(num > N)
            cnt+=N;
        else
            cnt+=num;        
    }
    
    if(cnt<find){
        binarySearch(mid+1,end,find);
    }else if(cnt>=find){
        if(result>mid)
            result=mid;
        binarySearch(start,mid-1,find);
    }
    
}
 
int main()
{
    
    cin>>N;
        
    long long K;
    cin>>K;
    
    binarySearch(1,N*N,K);
    cout<<result<<endl;
    
    return 0;
}