关于二进制——lowbit运算
lowbit(n)意思即为找出n在二进制表示下最后一位1即其后面的0所组成的数值,别的东西算法书上有,这里提出一个重要的公式
lowbit(n)=n&(~n+1)=n&(-n),这个有什么用啦,如果你知道了lowbit(n),那么你把n-lowbit(n)赋给n,在lowbit(n)就可以知道n二进制下倒数第二个1所表示的数值
以此类推,你就可求出n的每一个二进制下的1所表示的数值,这样再到表中查询也可以获得这些1分别在第几位
下面上一个重要的代码
int H[];
for(int i=;i<;i++) H[(1ll<<i)%]=i;//打表预处理,建立二进制数上每一个1代表的数值与其位数相对应
while(cin<<n)
{
while(n>)
{
cout<<H[(n&-n)%]<<"";
n-=n&-n;//遍历二进制下每一个数字1
}
cout<<endl;
}
下面在上一道题
思路大概是,每一个箱子的容量都可以表示成一个多项式f(n)=2^n+1,现在就是把铁块的总数拆成一些多项式的和,且这些多项式不能够重复。那么我们假设要用i个箱子,如果用x减去i后相当于把每个箱子的容量减1,那么剩下的都是由2^n组成的。所以剩下的数值如果转成二进制下的时候,能够有恰好有i个1,那么就说明是可以刚好用几个箱子把在这个铁块的值分了的
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int T,n;
int clac(int x)
{
int num=;
while(x)
{
num++;
x-=x&-x;
}
return num;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int flag=;
for(int i=;i<;i++)
{
if(n-i<) break;
if(clac(n-i)==i)
{
flag=;
break;
}
if(flag)
puts("YES");
else
puts("NO");
}
}
return ;
}
关于二进制——lowbit运算的更多相关文章
- 算法竞赛进阶指南--lowbit运算,找到二进制下所有是1的位
// lowbit运算,找到二进制下所有是1的位 int H[37]; // 预处理 for (int i = 0; i < 36; i++) H[(1ll << i) % 37] ...
- lowbit( )运算
--------开始-------- lowbit (n) 定义为非负整数n在二进制表示下“最低位的1及其后面所有的0构成的数值. 比如: n = 10 的二进制下为1010,则lowbit (n) ...
- 浅谈lowbit运算
关于lowbit运算的相关知识 本篇随笔简单讲解一下计算机中位运算的一类重要运算方式--\(lowbit\)运算. lowbit的概念 我们知道,任何一个正整数都可以被表示成一个二进制数.如: \[ ...
- 面试必备:高频算法题终章「图文解析 + 范例代码」之 矩阵 二进制 + 位运算 + LRU 合集
Attention 秋招接近尾声,我总结了 牛客.WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对.测试.欢迎食用 本 ...
- php 实现二进制加法运算
php实现二进制加法: 思路:没有工作中应用过此场景,但十进制的加法还是经常做的,能不能用十进制加法变相实现呢? 答案是可以的,并且php也提供进制间转换的函数,我的实现使用了 bindec():二进 ...
- 关于JAVA中Byte数据类型二进制赋值运算报错问题
自从JDK7更新之后,新增了二进制变量的表示,支持将整数类型用二进制来表示,用0b开头: 例如: byte b= (byte) 0b1000_0001; short s = (short) 0b100 ...
- 洛谷P1582 倒水 二进制 lowbit __builtin_popcount
P1582 倒水:https://www.luogu.org/problemnew/show/P1582 题意: 给定n瓶装有1升的水瓶,每次可以把两瓶装水量相同的水和成一瓶,问最少还要增加几瓶装有1 ...
- UVA 213 信息解码(二进制&位运算)
题意: 出自刘汝佳算法竞赛入门经典第四章. 考虑下面的01串序列: 0, 00, 01, 10, 000, 001, 010, 011, 100, 101, 110, 0000, 0001, …, 1 ...
- 状压dp之位运算
## 一.知识 1.我们知道计算机中数据由二进制数存储,一个二进制数的一位就是计算机中数据的最小单位bit,我们有一种运算符可直接对二进制数进行位运算,所以它的速度很快. 2.C++中的位运算符有6种 ...
随机推荐
- 字符串转化为int数组
String a = "1,2,3,4,5,6" String str[] = a.split(","); int array[] = new int[str. ...
- redis基本命令
1指定配置文件启动 ./redis-server /opt/server/redis/conf/redis.conf vim redis.conf #配置文件requirepass #后面跟密码 ...
- C# mongodb $set或$addToSet批量更新很慢原因
C# mongodb $set或$addToSet批量更新很慢原因的解决方法:关键字段要建立索引
- 区别JS中类的静态方法,静态变量,实例方法,实例变量
1.类的静态方法 先来段代码之后分析 // JS类静态函数 function BaseClass() { } // 类添加add函数 BaseClass.add = function() { cons ...
- html5 手机端 通讯录 touch 效果
不说那么多直接上代码. <html> <head> <meta http-equiv="Content-Type" content="tex ...
- c++读入优化
对于输入数据非常大的一些可(变)爱(态)题目,scanf就会大大拖慢程序的运行速度,cin就更不用说了,所以我们要用一种高大上的东西——读入优化. 读入优化的原理其实就是一个一个字符的读入,再组成数字 ...
- hdu5439 二分
题意 初始给了 1 2 两个数 第二步 因为第2个数是2 所以 在序列后面放上2个2 包括他自己之前有的 序列变成 1 2 2 第三步 因为第3个数是2 所以 在序列后面放上2个3 就变成了 1 ...
- E. Bear and Drawing
E. Bear and Drawing time limit per test 1 second memory limit per test 256 megabytes input stan ...
- Linux 进程间通讯
一.Linux 下进程间通讯方式 1)管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- mybatis源码解析6---MappedStatement解析
MappedStatement类位于mybatis包的org.apache.ibatis.mapping目录下,是一个final类型也就是说实例化之后就不允许改变 MappedStatement对象对 ...