Problem Description
Recently, Peter saw the equation
x0+2x1+4x2+...+2mxm=n
. He wants to find a solution
(x0,x1,x2,...,xm)
in such a manner that
∑i=0mxi
is minimum and every
xi
(
0≤i≤m
) is non-negative.
Input
There are multiple test cases. The first line of input contains an integer
T
(1≤T≤105)
, indicating the number of test cases. For each test case:
The first contains two integers n and m (0≤n,m≤109) .
The first contains two integers n and m (0≤n,m≤109) .
Output
For each test case, output the minimum value of
∑i=0mxi
.
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
显而易见,答案就是count(n%2^m)+n/2^m
#include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<bitset> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<functional> #define rep(i,j,k) for (int i = j; i <= k; i++) #define per(i,j,k) for (int i = j; i >= k; i--) using namespace std; typedef long long LL; const int low(int x) { return x&-x; } const int N = 4e5 + 10; const int mod = 1e9 + 7; const int INF = 0x7FFFFFFF; int T, n, m, ans; int main() { scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); ans = 0; rep(i, 0, m) { if (n & 1) ans++; n >>= 1; if (!n) break; } printf("%d\n", n * 2 + ans); } return 0; }