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).
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
Source
BestCoder Round #84
Recommend
wange2014 | We have carefully selected several similar problems for you: 5751 5750 5749 5747 5746
若位數要求比這個數的二進制位數大,直接算位數。
否則,先將多出來的位數壓進最高位。
之後的每一位,1按1算,0按0算。
代碼:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
int ch[100];
using namespace std;
int work(int n)
{
int le=0;
while(n!=0)
{
ch[le++]=n%2;
n/=2;
}
return le;
}
int main (void)
{
int t;
cin>>t;
while(t--)
{
int n,m;
scanf("%d %d",&n,&m);
int re=work(n);
long long ans=0;
if(re<=m)
{
for(int i=re-1;i>=0;i--)
{
if(ch[i]==1)
ans++;
}
printf("%I64d\n",ans);
continue;
}
if(re>m)
{
ans+=n>>m;//將多出來的位數壓進去
n%=(1<<m);//將n變小
while(n)
{
if(n&1)//如果是1,加1
{
ans++;
}
n>>=1;
}
printf("%I64d\n",ans);
}
}
return 0;
}