这个题可以想到二进制上,如果m+1>=二进制位数,那么就是二进制各位的和,
如果m+1<二进制位数,那么把前面的加到最高位就可以了。。。
#include <iostream>
#include <stdio.h>
#include<math.h>
using namespace std;
int x;
int data[30];
int main()
{
int n,p,q;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%d %d",&p,&q);
int i=0;
int s=0;
while(p!=0)
{
data[i]=p%2;
p=p/2;
s+=data[i];
i++;
}
if(i<=q+1) printf("%d\n",s);
else if(i>q+1)
{
for(int j=i-1;j>=q+1;j--)
{
s-=data[j];
if(data[j]==1)
s+=pow(2,j-q);
}
printf("%d\n",s);
}
}
}
return 0;
}