Aaronson[数学题??]

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\n", sum);
	}
}
posted @ 2020-04-30 21:27  poozhai  阅读(84)  评论(0编辑  收藏  举报