진수 | 함수 |
---|---|
2진수 | bin() |
8진수 | oct() |
16진수 | hex() |
- 2진수를 나타내는 방법 : 0b를 앞에 붙인다.
- 8진수를 나타내는 방법 : 0o를 붙인다.
- 16진수를 나타내는 방법: 0x를 붙인다.
물병에는 각 1리터의 물이 들어있고, 각각 같은 양의 물이 들어있는 물병만 합칠 수 있다.
따라서 1과1, 2와2 ,4와4, 8과8 ... 이렇게 2의 X제곱인 수로만 이루어져 합쳐질 수 있다.
우리는 최소 K개의 물병을 남길 수 있기 때문에 N + a 개의 1L 물병을 이용하여 2의 X제곱 리터인 물병을 최대 K개를 만들면 된다. 여기서 a가 바로 추가해야할 물병의 수이다.
먼저 N을 2진수 변환 후, 1의 개수를 세주면 1의 개수가 2의 X제곱인 수가 된다.
우리는 최대 K개를 만들어야 하기 때문에 1의 개수가 K보다 작거나 같아질 때까지 N에 1을 더하고, 동시에 더해야하는 물병의 개수를 Count해 준다.
K보다 작거나 같아지면 더 이상 물병을 더하지 않아도 되기 때문에 그 때 count값을 출력하면 된다.
N,K=map(int, input().split())
count=0
#2진수의 1의 개수가 현재 더이상 합칠 수 없는 물병 개수
#K보다 작아질 때까지 물병 개수를 더함
while bin(N).count('1') > K:
N+=1
count+=1
print(count)