C. p-binary

Vasya will fancy any number as long as it is an integer power of two. Petya, on the other hand, is very conservative and only likes a single integer p (which may be positive, negative, or zero). To combine their tastes, they invented p-binary numbers of the form 2x+p, where x is a non-negative integer.

For example, some −9-binary ("minus nine" binary) numbers are: −8 (minus eight), 7 and 1015 (−8=20−9, 7=24−9, 1015=210−9).

The boys now use p-binary numbers to represent everything. They now face a problem: given a positive integer n, what's the smallest number of p-binary numbers (not necessarily distinct) they need to represent n as their sum? It may be possible that representation is impossible altogether. Help them solve this problem.

For example, if p=0 we can represent 7 as 20+21+22.

And if p=−9 we can represent 7 as one number (24−9).

Note that negative p-binary numbers are allowed to be in the sum (see the Notes section for an example).

Input

The only line contains two integers n and p (1≤n≤109, −1000≤p≤1000).

Output

If it is impossible to represent n as the sum of any number of p-binary numbers, print a single integer −1. Otherwise, print the smallest possible number of summands.

Examples

input

24 0

output

2

Note

0-binary numbers are just regular binary powers, thus in the first sample case we can represent 24=(24+0)+(23+0).

In the second sample case, we can represent 24=(24+1)+(22+1)+(20+1).

In the third sample case, we can represent 24=(24−1)+(22−1)+(22−1)+(22−1). Note that repeated summands are allowed.

In the fourth sample case, we can represent 4=(24−7)+(21−7). Note that the second summand is negative, which is allowed.

In the fifth sample case, no representation is possible.

题意

定义p-binary为2^x+p

现在给你一个数x,和一个p。

问你最少用多少个p-binary能构造出x,如果没有输出-1

题解

转化为:

x = 2^x1 + 2^x2 + ... + 2^xn + n*p

首先我们知道任何数都能用二进制表示,如果p=0的话,肯定是有解的。那么答案最少都是x的2进制1的个数。

另外什么情况无解呢,即x-n*p<0的时候肯定无解,可以更加有优化为x-n*p<n的时候无解。

答案实际上就是n,我们从小到大枚举n,然后check现在的2进制中1的个数是否小于等于n。

代码

#include<bits/stdc++.h>
using namespace std; int Count(int x){
int number=0;
for(;x;x-=x&-x){
number++;
}
return number;
}
int main(){
int n,p,ans=0;
scanf("%d%d",&n,&p);
while(1){
n-=p;
ans++;
int cnt=Count(n);
if(ans>n){
cout<<"-1"<<endl;
return 0;
}
if(cnt<=ans){
cout<<ans<<endl;
return 0;
}
}
}

最新文章

  1. java ---- 面试题
  2. JVM-漫游
  3. 如何导出FlashFXP的站点配置文件
  4. deep learning 的综述
  5. mysql explain知道
  6. ActiveX控件dsoFramer的使用(word、excel、PPT)
  7. drupal7安装中文错误
  8. hibernate 双向一对多关系(Annotation mappedBy注解理解)
  9. [百度空间] [原]android下的各种坑
  10. 获取当前的 viewController
  11. facebook代码发布
  12. BNU10792:沙漠旅行者
  13. DOM(一)
  14. 关于“foreach循环”中遇到的几个问题总结
  15. 百度百科Tooltip的实现--原生js的应用
  16. POI tools 参数化生成excel表格
  17. python的面向对象和面向过程
  18. Redis报错 Server started, Redis version 3.2.13 Can&#39;t handle RDB format version 9 Fatal error loading the DB: Invalid argument. Exiting.
  19. iOS 代码混淆
  20. XML 和 DTD

热门文章

  1. Windows10 下利用Hyper-V安装CentOS系统
  2. awk命令使用整理
  3. 【Linux命令】工作目录切换命令(pwd,cd,ls)
  4. 基于appium的常用元素定位方法
  5. GNSS频率分配表
  6. 利用zabbix监控ogg进程(Linux平台下)
  7. 动态类型dynamic转换为特定类型T的方案
  8. 百度Sitemap生成器
  9. IIS安装和ASP.NET Web应用程序开发期间部署到IIS自定义主机域名并附加进程调试
  10. MySQL学习——操作存储过程