CF1225C p-binary
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\),使得存在:
\]
那么对于题意,我们很容易发现,这个数就是多加了\(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运算不太了解的同学,可参考本蒟蒻的这篇博客:
代码:
#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的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- ILJMALL project过程中遇到Fragment嵌套问题:IllegalArgumentException: Binary XML file line #23: Duplicate id
出现场景:当点击"分类"再返回"首页"时,发生error退出 BUG描述:Caused by: java.lang.IllegalArgumentExcep ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- Leetcode: Convert sorted list to binary search tree (No. 109)
Sept. 22, 2015 学一道算法题, 经常回顾一下. 第二次重温, 决定增加一些图片, 帮助自己记忆. 在网上找他人的资料, 不如自己动手. 把从底向上树的算法搞通俗一些. 先做一个例子: 9 ...
- 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 ...
- [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 ...
- [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点
Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...
随机推荐
- 201871010126 王亚涛 《面向对象程序设计(java)》 第一周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/wyt0455820/ ...
- c++ istringstream用法
istringstream用法,见如下代码 #include <iostream> #include"sstream" using namespace std; int ...
- a迭代尾声处理
这是小组开发a阶段迭代的成员工具teambition,现阶段a迭代需要最后的整合,同时我们也在开始了b迭代过程,并不断完善在开发工程中我们文档方面的记录
- Yet Another Broken Keyboard
time limit per test2 secondsmemory limit per test256 megabytesinput: standard inputoutput: standard ...
- golang数据结构之递归解决迷宫问题
简单来说:递归就是函数/方法自己调用自己,只是每次传入不同的变量. 递归可以解决各种数学问题:n皇后问题.阶乘问题.汉诺塔.迷宫问题.球和篮子问题等等: maze.go package maze im ...
- php程序内存优化之数组操作优化
一.前言这篇文章其实是上篇文章的内存优化部分.博主的php程序在执行的时候,报错: Out of memory (allocated 364904448) (tried to allocate 262 ...
- 关于Unity中AI随机巡逻障碍物预判与快速运动时物理穿透的思考
如果不想用Unity的导航系统,很多时候就要解决如何预判前进路径中的障碍物问题,之前也看过一些非常经典的寻路算法例如AStar寻路,虽然也可实现功能,但总感觉有些小题大做.寻路算法大多数都是为了得出最 ...
- pytest框架之mark标签
对测试用例打标签,在运行测试用例的时候,可根据标签名来过滤要运行的用例. 一.注册标签名 1.创建pytest.ini文件,在文件中按如下方式添加标签名: [pytest] markers = smo ...
- LinkedTransferQueue
/** *LinkedTransferQueue是有容量的, * 当第一个生产者线程调用transfer时,如果没有消费者,会阻塞. * 第二个生产者线程调用transfer时,如果没有消费者,会添加 ...
- Java生鲜电商平台-电商支付流程架构实战
Java生鲜电商平台-电商支付流程架构实战 说明:我一直秉承的就是接地气的业务架构实战.我的文章都有一个这样的核心. 1. 业务场景 2. 解决问题. 3.代码实现. 4.代码重构. 5.总结与复盘. ...