题目链接:https://vjudge.net/problem/CodeForces-1247C
题解:n-mp=2^x1+2^x2+...;令x=n-mp,f(x):二进制中1的个数;若m满足f(x)<=m<=x,则m为答案;
因为1.若f(x)>m,则无法匹配;当f(x)<m时,因为可能·存在这样2^3+2^3=2^4可以合并;2.二进制和最小值为m,所以x>=m;
#include<bits/stdc++.h>
using namespace std;
int num_1(int n){
int sum=0;
while(n){
if(n&1) sum++;
n>>=1;
}
return sum;
}
int main(){
int n,p;
cin>>n>>p;
int m=0;
while(1){
n-=p;
m++;
if(n<=0) break;
if(num_1(n)<=m){
if(n<m) break;
cout<<m<<endl;
return 0;
}
}
cout<<-1<<endl;
return 0;
}