杯子
题目描述
小明买了N个容积可以是无穷大的杯子,刚开始的时候每个杯子里有1升水,接着小明发现杯子实在太多了,于是他决定保留不超过K个杯子。每次他选择两个当前含水量相等的杯子,把一个杯子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的杯子)
显然在有些情况下小明无法达到他的目标,比如N=3,K=1。此时小明会重新买一些新的杯子(新杯子容积无限,开始时有1升水),以达到目标。
现在小明想知道,最少需要买多少个新杯子才能达到目标呢?
输入
一行两个正整数,N,K(1≤N≤1000000000,K≤10)。
输出
一个非负整数,表示最少需要买多少新杯子。
样例输入
复制样例数据
3 1
样例输出
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long in;
const int N = 1e5+10;
in a[N];
int main()
{
in n,k;
cin>>n>>k;
if(k>=n) {
printf("0\n");
return 0;
}
in cnt=1;
in t=n;
while(t){
a[cnt++]=t%2;
t/=2;
}
in cnt1=0;
for(in i=1;i<=cnt;i++){
if(a[i]==1) cnt1++;
}
if(cnt1<=k) {
cout<<0<<endl;
return 0;
}
in cnt11=0;
in x;
in y;
for(in i=cnt;i>=1;i--){
if(a[i]==1) cnt11++;
if(cnt11==k){
x=i-1;
y=1;
for(in j=2;j<=i;j++){
y*=2;
}
break;
}
}
cnt11=0;
t=1;
for(in i=1;i<=x;i++){
cnt11+=a[i]*t;
t*=2;
}
in ans=y-cnt11;
cout<<ans<<endl;
return 0;
}