Sample Input
10
1 2
3 2
5 2
10 2
10 3
10 4
13 5
20 4
11 11
12 3
Sample Output
1
2
2
3
2
2
3
2
3
2
这就是个数学题,,,
让和最小,就是尽量让 x 小, 就要让x前的系数尽可能大.
从2m 开始枚举系数,算出x值, 记录和
代码就这么短
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int T; scanf("%d", &T);
while(T--){
long long sum = 0;//记录和, 记得开long long
int n, m; scanf("%d%d", &n, &m);
int maxpow = min(m, 31);//n的范围不超过2的三十一次方,m超过31显然没有意义
for(int pow=maxpow; pow>=0; pow--){//枚举系数的指数
int now = n/(1<<pow);//当前的x值
n -= now * (1<<pow);//n减去这一项
sum += now;//记录和
if(n == 0) break;//n被表示完了
}
printf("%lld
", sum);
}
}