Round Numbers /// 组合计数 oj21455
题目大意:
给定a,b
输出[a,b]的闭区间中round number的数量
所谓round就是一个数在二进制下0的个数大于等于1的个数
0的个数>=1的个数 也就是1的个数<=0的个数
那么 l 长度中, 1的个数num = l / 2 个,如:l=4 num=2, l=5 num=2
而当二进制长度为 l 时,首位肯定为1
那么应在剩下的 l-1 位中 选出 0 到 l / 2 - 1 个位置为1的情况
递推出31内的组合数就够了 因为 2^31 > 2e9
找到a,b二进制的位数 L,R
直接计算 L位 到 R-1位 的所有数量sum
L位中 比a小的 应该从sum中删去
R位中 比b小的 应该加进sum中
如:二进制同样位数下 比 1010100 小的,l=7 l/2=3
(为什么不从第一个1开始 后面会说)
从第二个1开始 1010000 要比它小 应该将1置为0
即10_ _ _ _ 这样就是在之后的4个位置中选出 3-(2-1) 个1
(最多3个1 已经存在2个 将当前位置为0 那么-1)
再到第三个1的情况 101000 要比它小 应该将1置为0
即1010_ _ 这样就是在之后的2个位置中选出 3-(3-1)个1
从第一个1开始是不能将其置为0的 所以直接从第二个开始
#include <bits/stdc++.h>
#define ll long long
using namespace std; int bi[];
int getNum(int x) {
int c=;
while(x) {
bi[++c]=x&;
x >>= ;
}
return c;
}
ll C[][];
void init() {
C[][]=C[][]=C[][]=1LL;
for(int i=;i<=;i++) {
C[i][]=C[i][i]=1LL;
for(int j=;j<i;j++)
C[i][j]=C[i-][j-]+C[i-][j];
}
}
int main()
{
ll a,b;
init();
while(~scanf("%lld%lld",&a,&b)) {
ll ans=;
int L=getNum(a), c=; // 二进制位数
for(int i=L-;i>=;i--)
if(bi[i]) { c++;
for(int j=;j<=L/-(c-);j++)
ans-=C[i-][j]; /// 减去L位中比a小的
}
int R=getNum(b); c=;
for(int i=R-;i>=;i--)
if(bi[i]) { c++;
for(int j=;j<=R/-(c-);j++)
ans+=C[i-][j]; /// 加上R位中比b小的
} for(int i=L;i<R;i++) { /// 加上L位到R-1位的个数
for(int j=;j<i/;j++)
ans+=C[i-][j];
}
if(c<=R/) ans++; // 判断b是不是not round
// a不需要判断 因为包含在L位中 printf("%lld\n",ans);
} return ;
}
Round Numbers /// 组合计数 oj21455的更多相关文章
- [CodeForces 300C Beautiful Numbers]组合计数
题意:十进制的每一位仅由a和b组成的数是“X数”,求长度为n,各数位上的数的和是X数的X数的个数 思路:由于总的位数为n,每一位只能是a或b,令a有p个,则b有(n-p)个,如果 a*p+b*(n-p ...
- [ACM] POJ 3252 Round Numbers (的范围内的二元0数大于或等于1数的数目,组合)
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8590 Accepted: 3003 Des ...
- POJ 3252 Round Numbers(组合)
题目链接:http://poj.org/problem?id=3252 题意: 一个数的二进制表示中0的个数大于等于1的个数则称作Round Numbers.求区间[L,R]内的 Round Numb ...
- Round Numbers (排列组合)
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7558 Accepted: 2596 Description The c ...
- Round Numbers(组合数学)
Round Numbers Time Limit : 4000/2000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Tota ...
- 4-圆数Round Numbers(数位dp)
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14947 Accepted: 6023 De ...
- 【BZOJ】1662: [Usaco2006 Nov]Round Numbers 圆环数(数位dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1662 这道题折腾了我两天啊-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 果然 ...
- POJ 3252 Round Numbers 组合数学
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13381 Accepted: 5208 Description The ...
- poj3252 Round Numbers(数位dp)
题目传送门 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16439 Accepted: 6 ...
随机推荐
- /etc/fstab修改及mkfs(e2label)相关应用与疑问
http://blog.chinaunix.net/uid-23392298-id-62318.html 我们将以问题开始说明: 案例: 由于n年前的误操作,导致系统启动的时候,提示如下错误:Coul ...
- Delphi多线程详解
(整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者 ...
- super_blocks没有导出
在模块中,通过查询super_blocks列表,来遍历系统中的所有super_block,但是出现与下面类似的错误: http://stackoverflow.com/q/5051111/941650 ...
- jQuery 实现复选框全选、反选及获取选中的值
实现复选框全选,反选及获取选中的值: 代码如下: <!doctype html> <html lang="en"> <head> <met ...
- Java中有趣的String、StringBuffer与StringBuilder
String介绍 String类属于java.lang包中,String类是不可变类,任何对String的改变都会引发新的String对象的生成. 创建String的两种方式: 1.通过构造器创建:S ...
- Intellij IDEA gradle项目目录介绍
Gradle简介 Java的构建,经历了从Ant-->Maven->Gradle的过程,每一次的进步,都是为了解决之前的工具带来的问题: Ant:Ant的功能虽然强大,但过于灵活,规范性不 ...
- 2018-11-24-C#-7.0
title author date CreateTime categories C# 7.0 lindexi 2018-11-24 16:32:58 +0800 2018-2-13 17:23:3 + ...
- Mongodb安装遇到的问题
今天我第一次接触MongoDB,在安装过程中,因为对这个东西不了解,报错了我也不知道是哪里的错,还在网上查了半天资料,后来我懂了,感觉上午就是在浪费时间,是我没睡醒,没睡醒.. 在安装上MongoDB ...
- window操作命令
netstat -ano 查看所有端口 netstat -ano|findstr "8005" 查看指定端口
- redis数据库操作
一.String(字符串)操作 String在redis中的存储是按照key-value的形式存储 1.SET key value [EX seconds] [PX milliseconds] [NX ...