UVA_12670_Counting ones(统计区间二进制1个数)
来源:互联网 发布:网络借贷需要什么资料 编辑:程序博客网 时间:2024/06/05 17:37
题目链接:http://uva.onlinejudge.org/external/126/12670.pdf
题型:数论
题意:求从a到b之间的所有数的二进制数中的1的个数。
分析:
二进制数按顺序可以发现,二进制中分布都是规律的,最低位是010101...,次低位是00110011...
算出0到b之间的1的个数和0到a-1之间的1的个数,然后差值就是a到b之间的1的个数。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cstring>#define LL long longusing namespace std;LL cal(LL x){ LL cnt = 0; LL tmp = x; while(tmp){ tmp /= 2; cnt ++; } LL mul = 1; LL ans = 0; for(int i=1;i<=cnt;i++){ //cout<<"mul = "<<mul<<endl; LL ts = (x+1)/(mul*2)*mul; LL yu = (x+1)%(mul*2); yu = (yu<=mul)? 0 : (yu-mul); ans += (ts + yu); mul*=2; } return ans;}int main(){ LL a,b; while(~scanf("%lld%lld",&a,&b)){ //printf("%lld\n",cal(a-1)); //printf("%lld\n",cal(b)); printf("%lld\n",cal(b)-cal(a-1)); } return 0;}/*1000000000000000 100000000000000002 129007199254740992 9007199254740992*/
0 0
- UVA_12670_Counting ones(统计区间二进制1个数)
- 统计二进制1个数
- 统计二进制数中“1”的个数(懂二进制)
- leetcode解题之485. Max Consecutive Ones Java版 (二进制连续最长1的个数)
- 统计二进制中1的个数(四种方案)
- (3)统计二进制数中1的个数
- 统计单词个数 (区间DP)
- 统计二进制中1的个数
- 统计unsigned int 二进制1的个数!
- 统计二进制中1的个数
- 统计二进制串中的1的个数 .
- 统计二进制数1的个数
- 二进制中1的个数统计
- 统计二进制数中1的个数
- 统计二进制数中的1的个数
- 统计二进制中1的个数
- 统计二进制正整数中1的个数
- 统计二进制数中1 的个数
- 【原】新装SQL Server 2014 遇到问题的解决方法。
- 网易免费企业邮支持POP3/SMTP服务,您可以通过电脑客户端软件更好地收发邮件
- 总结三种Shell脚本编程中避免SFTP输入密码的方法
- 【andriod应用开发入门教程】学习笔记一
- JavaScript权威指南第08章 函数
- UVA_12670_Counting ones(统计区间二进制1个数)
- UIDatePicker 的使用
- db_block_checking与db_block_checksum
- EL表达式中的数字类型
- 2014年APP生存运营之道
- Loadrunner12,QTP/UFT12,QC/ALM12
- 1708: [Usaco2007 Oct]Money奶牛的硬币
- OSG不能显示中文字的问题(一)
- oracle用户解锁