题目描述
一天,CC 买了 NN 个容量可以认为是无限大的瓶子,开始时每个瓶子里有 11 升水。接着 CC 发现瓶子实在太多了,于是他决定保留不超过 KK 个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)
显然在某些情况下 CC 无法达到目标,比如 N=3N=3、K=1K=1。此时 CC 会重新买一些新的瓶子(新瓶子容量无限,开始时有 11 升水),以达到目标。
现在 CC 想知道,最少需要买多少新瓶子才能达到目标呢?
输入格式
一行两个正整数 N,K(1≤N≤2×1091≤N≤2×109,K≤1000K≤1000)。
输出格式
一个非负整数,表示最少需要买多少新瓶子。
输入输出样例
输入 #1
3 1
输出 #1
1
输入 #2
13 2
输出 #2
3
输入 #3
1000000 5
输出 #3
15808
参考程序:
点个赞再走吧
#include<bits/stdc++.h>
using namespace std;
long long jz1(long long x){
long long k=0;
while(x){
if(x&1){
k++;
}
x=x>>1;
}
return k;
}
long long pown(long long x){
int pow=1;
while(x%2!=1){
pow*=2;
x=x>>1;
}
return pow;
}
int main()
{
long long n,k,pow,o=0;
cin>>n>>k;
while(n){
int t=jz1(n);
if(t<=k){
break;
}
pow=pown(n);
o+=pow;
n+=pow;
}
cout<<o;
}
//还是没有注释很棒吧