CF1225C 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 pp (which may be positive, negative, or zero). To combine their tastes, they invented pp -binary numbers of the form 2^x + p2x+p , where xx is a non-negative integer.

For example, some -9−9 -binary ("minus nine" binary) numbers are: -8−8 (minus eight), 77 and 10151015 ( -8=2^0-9−8=20−9 , 7=2^4-97=24−9 , 1015=2^{10}-91015=210−9 ).

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

For example, if p=0p=0 we can represent 77 as 2^0 + 2^1 + 2^220+21+22 .

And if p=-9p=−9 we can represent 77 as one number (2^4-9)(24−9) .

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

输入格式

The only line contains two integers nn and pp ( 1 \leq n \leq 10^91≤n≤109 , -1000 \leq p \leq 1000−1000≤p≤1000 ).

输出格式

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

输入输出样例

输入 #1复制

输出 #1复制

输入 #2复制

输出 #2复制

输入 #3复制

输出 #3复制

输入 #4复制

输出 #4复制

输入 #5复制

输出 #5复制

说明/提示

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

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

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

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

In the fifth sample case, no representation is possible.

题解:

对于一个给定的\(n,p\),试求一个最小的\(k\),使得存在:

\[\sum_{i=1}^{k}{(2^{a_i}+p)}
\]

那么对于题意,我们很容易发现,这个数就是多加了\(i\)个\(p\),如果把这\(i\)个\(p\)去掉,那么就显然可以把这个数\(n-i\times p\)进行二进制拆分,拆成很多个二的整数次幂之和,我们要求出这个最小的加数数量。

根据二进制拆分的原则,我们把这个数\(n-i\times p\)用二进制表示,其中有\(1\)对应的第\(i\)位就是\(2^{i-1}\)(根据位运算的性质)。

那么,我们算出来这个数\(n-i\times p\)的二进制表示中1的个数,如果这个个数比\(i\)大,那么就不合法(这是显然的)。并且,如果\(n-i\times p<i\),那么也不合法。

那么我们从小到大枚举,判断一下即可。

如有对lowbit运算不太了解的同学,可参考本蒟蒻的这篇博客:

浅谈lowbit运算

代码:

#include<cstdio>
using namespace std;
int n,p,ans,flag;
int lowbit(int x)
{
int ret=0;
while(x)
{
x-=x&-x;
ret++;
}
return ret;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=1;;i++)
{
if(n-i*p<i)
break;
if(lowbit(n-i*p)>i)
continue;
ans=i;
flag=1;
break;
}
if(flag)
{
printf("%d",ans);
return 0;
}
else
{
printf("-1");
return 0;
}
}

CF1225C p-binary的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id

    出现场景:当点击"分类"再返回"首页"时,发生error退出   BUG描述:Caused by: java.lang.IllegalArgumentExcep ...

  3. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  4. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  5. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  6. Leetcode: Convert sorted list to binary search tree (No. 109)

    Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...

  7. Leetcode, construct binary tree from inorder and post order traversal

    Sept. 13, 2015 Spent more than a few hours to work on the leetcode problem, and my favorite blogs ab ...

  8. [LeetCode] Binary Watch 二进制表

    A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom ...

  9. [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点

    Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...

随机推荐

  1. 2019 SDN上机第6次作业

    2019 SDN上机第6次作业 1.实验拓扑 (1)实验拓扑 (2)使用Python脚本完成拓扑搭建 from mininet.topo import Topo from mininet.net im ...

  2. Python爬虫教程-实现百度翻译

    使用python爬虫实现百度翻译功能python爬虫实现百度翻译: python解释器[模拟浏览器],发送[post请求],传入待[翻译的内容]作为参数,获取[百度翻译的结果] 通过开发者工具,获取发 ...

  3. idea插件备份

  4. HTTP常见的几种认证机制

    几种常用的认证机制 ===================转自https://www.cnblogs.com/xiekeli/红心李的文章====================== 我是一个测试人员 ...

  5. js获取计算机操作系统版本

    如题,想要获取当先计算机的操作系统和版本号的话,可以用如下方法. 首先,创建osversion.js文件,文件里面的代码如下 var osData = [ { name: 'Windows 2000' ...

  6. python3之猜数字游戏

    猜数字小游戏 # coding:utf-8 import random #利用random生成一个1-10的随机数 luckeyNum = random.randint(1,10) #限定猜的次数 l ...

  7. MySQL基础(MySQL5.7安装、配置)

      写在前面: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQ ...

  8. FCC---Change Animation Timing with Keywords--两个小球从A都B,相同循环时间 duration, 不同的速度 speed

    In CSS animations, the animation-timing-function property controls how quickly an animated element c ...

  9. js将4个字节型字符串转为Float

    function convertFloat(byteStr) { var buffer = str2ArrayBuffer(byteStr, 4); var dataView = new DataVi ...

  10. arcgis api 3.x for js 解决 textSymbol 文本换行显示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...