发现的好东西——bitset
先向各位大佬介绍一个水题
任何一个正整数都可以用2的幂次方表示。例如
137=2^7+2^3+2^0
同时约定方次用括号来表示,即a^b 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2^2+2+2^0 (2^1用2表示)
3=2+2^0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2^10 +2^8 +2^5 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入输出格式
输入格式:
一个正整数n(n≤20000)。
输出格式:
符合约定的n的0,2表示(在表示中不能有空格)
输入输出样例
1315
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 作为蒟蒻的我,对这道题表示被括号吓到了,但。。。
大致思路是这样的
: ++++
//需要位运算的支持(请忽略)
stack
: =+
stack
stack
if(stack[i]<=) s.pop(); return i;
else printf("2(%d)",find(x));
思路大概是对的,但对于我来说,程序实践又成为了一个问题。
不打代码都不知道自己原来这么水。orz
于是我去翻了翻题解
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;
int n;
void solve(int x)
{
if(x==||x==||x==)return ;//1,2,0不作分解
bitset<> b=x;//STL大法好啊
int sum=b.count(),s=;//记录何时到最后一位,以便输出"+"
for(int i=b.size()-;~i;--i)//从高阶位遍历
if(b[i])//如果是1,则处理
{
s++;//记录已经走过的位数
printf("");
if(i!=)printf("(");//只有次幂不为一时输出括号
solve(i);//递归
//递归输出:
if(i==||i==)printf("%d",i);//只输出2,0 if(i!=)printf(")");
if(s<sum)printf("+");
}
}
int main()
{
cin>>n;
if(n==)return printf("2(0)"),;//特殊点判断
if(n==)return printf(""),;
solve(n);//进入递归
return ;
} //作者: 蠢萌_小三爷 (luogu ID) orz
我觉得bitset这个东西简直太神奇了。
所以我就去查了查:
C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。
bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。
(人话:定义一串二进制数)
具体操作:
定义:
#include<bitset>
using namespace std;
bitset<> u(s); //32位的u,是s的一个副本
bitset<> u(s,pos,n) //32位的u,是从n开始的s的一个副本
bitset<> u; //32位的u,每一位都为0
bitset<32> u(0x7ffff)
和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。
当用unsigned long值作为bitset对象的初始值时,该值将转化为二进制的位模式。
在32位unsigned long的机器上,十六进制值0xffff表示为二进制位就是十六个1和十六个0(每个0xf可表示为1111)。可以用0xffff初始化bitset对象
当用string对象初始化bitset对象时,string对象直接表示为位模式。
具体函数操作

to_ulong操作返回一个unsigned long值,该值与bitset对象的位模式存储值相同。仅当bitset类型的长度小于或等于unsigned long的长度时,才可以使用to_ulong操作。
果然还是好神奇!!!
ps:本文的部分资料来自
Liam Q的专栏,各位可以去膜拜原大佬
连接在此:http://blog.csdn.net/qll125596718/article/details/6901935
发现的好东西——bitset的更多相关文章
- 翻String.Format源码发现的新东西:StringBuilderCache
起因: 记不清楚今天是为毛点想F12看String.Format的实现源码了,反正就看到了下图的鸟东西: 瞬间石化有没有,StringBuilder还能这么获取? 研究StringBuilderCac ...
- 科学家用AI看月球后,却发现了这些东西
人工智能(AI)几乎已经无所不在,我们生活的大多数方面都已经被它们渗透,随着AI在过去几年取得的令人震惊的进步,它在许多方面都可能帮助我们的生活变得更美好.近日,AI在月球上发现了近7000个未被 ...
- 刚从一道题发现的一些东西,PHP笔记,关于extract和null 空字符串
队友发给我的一道extract变量的最基础的题目,他发现了一些问题,当传入shiyan=&flag=0时出flag,当传入shiyan=0&flag=0时不出flag,传入shiyan ...
- 从HDFS的写入和读取中,我发现了点东西
摘要:从HDFS的写入和读取中,我们能学习到什么? 本文分享自华为云社区<从HDFS的写入和读取中,我们能学习到什么>,作者: breakDawn . 最近开发过程涉及了一些和文件读取有关 ...
- JavaScript--我发现,原来你是这样的JS(引用类型不简单,且听我娓娓道来)
一.介绍 没错,这是第五篇,到了引用类型,这次要分成两次博文了,太多内容了,这是前篇,篇幅很长也很多代码,主要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病. 坚持看坚持写,不容易不容易,希望大 ...
- HttpClientFactory与Steeltoe结合来完成服务发现
前言 上一篇说了一下用HttpClientFactory实现了简单的熔断降级. 这篇就来简单说说用HttpClientFactory来实现服务发现.由于标题已经好明显的说了Steeltoe 因此这里会 ...
- NOIP不开心记(不开心的东西肯定不能给别人看!)
写在前面的.. noip之后一直很想写一下什么的.. 老师:这就是你逃晚自习来机房的原因?? Day 0 坐了好久的车来到GZ.. 年年都是GZ.. sb酒店垃圾的要死.. 路上都是杀马特.. 隔壁还 ...
- JS--我发现,原来你是这样的JS(引用类型不简单[上篇],且听我娓娓道来)
一.介绍 没错,这是第五篇,到了引用类型,这次要分成两次博文了,太多内容了,这是前篇,篇幅很长也很多代码,主要讲引用类型和常用的引用类型,代码试验过的,老铁没毛病. 坚持看坚持写,不容易不容易,希望大 ...
- 发现一个nginx LUA开发Web App的框架
nginx是个好东西, nginx的openrtsy发行版本更是个好东西. 今天又发现个好东西 :Moochine MOOCHINE - 一个简单的轻量级的web framework, 基于ngx_O ...
随机推荐
- 006-shiro授权
一.授权流程 二.三种授权方式 2.1.编程式:通过写if/else 授权代码块完成: Subject subject = SecurityUtils.getSubject(); if(subject ...
- IOS JAVA PHP 安卓 通用加密方式
PHP代码: class Aes { private $hex_iv = '00000000000000000000000000000000'; // converted JAVA byte code ...
- Tkprof工具详解一(转载)
在数据库生成的oracle trace文件中,可读性是比较差的,此时可使用tkprof工具来格式化trace文件,tkprof是一个命令行工具,作用就是把原始的跟踪trace文件作为输入,然后格式化一 ...
- http的请求流程
# !/usr/bin/env python # coding:utf-8 import socket def handle_request(client): buf = client.recv(10 ...
- Java并发之——线程池
一. 线程池介绍 1.1 简介 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡 ...
- Kattis - cokolada【水】
Kattis - cokolada[水] 题意 有一个人想吃巧克力,但是巧克力都是按照 2 的幂次的数量包装的,然后他想吃一定数量块的巧克力,然后可以敲碎,每次敲碎都分成两半,比如四块装的分成两块就是 ...
- [CTSC2008]祭祀
题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...
- jQuery带小图标的Tab切换焦点图
在线演示 本地下载
- 20145201 《Java程序设计》第一周学习总结(修改)
# 20145201 <Java程序设计>第一周学习总结 ## 教材学习内容总结 万事开头难,终于开始学习了Java.寒假的时候看到老师的要求确实有点慌,但是这周翻开书,从书本知识第一行学 ...
- Jave基础之选择排序
选择排序(Selection sort) 基本介绍 选择排序: 每一次从未排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余未排序的元素中选出最小(或最大的)放在已排序序 ...