题目大意:

给定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的更多相关文章

  1. [CodeForces 300C Beautiful Numbers]组合计数

    题意:十进制的每一位仅由a和b组成的数是“X数”,求长度为n,各数位上的数的和是X数的X数的个数 思路:由于总的位数为n,每一位只能是a或b,令a有p个,则b有(n-p)个,如果 a*p+b*(n-p ...

  2. [ACM] POJ 3252 Round Numbers (的范围内的二元0数大于或等于1数的数目,组合)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8590   Accepted: 3003 Des ...

  3. POJ 3252 Round Numbers(组合)

    题目链接:http://poj.org/problem?id=3252 题意: 一个数的二进制表示中0的个数大于等于1的个数则称作Round Numbers.求区间[L,R]内的 Round Numb ...

  4. Round Numbers (排列组合)

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7558   Accepted: 2596 Description The c ...

  5. Round Numbers(组合数学)

    Round Numbers Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tota ...

  6. 4-圆数Round Numbers(数位dp)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14947   Accepted: 6023 De ...

  7. 【BZOJ】1662: [Usaco2006 Nov]Round Numbers 圆环数(数位dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1662 这道题折腾了我两天啊-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 果然 ...

  8. POJ 3252 Round Numbers 组合数学

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13381   Accepted: 5208 Description The ...

  9. poj3252 Round Numbers(数位dp)

    题目传送门 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16439   Accepted: 6 ...

随机推荐

  1. 动态栈-------C语言

    使用带头结点的单链表实现 主要使用链表中的头插来实现栈的先进后出的特点 /***************************************************** Author:Si ...

  2. hibernate基本配置优化

    前面已经说过hibernate的基本配置了,现在对之前的基本配置进行代码优化: 写一个读取配置工具 package tool; import org.hibernate.Session; import ...

  3. Haskell语法

    http://www.ibm.com/developerworks/cn/java/j-cb07186.html 1. 构造符号 : 比如: 1:2:3:[] 而常用的 [1,2,3] 是一种语法糖( ...

  4. 你真的懂return吗?

    递归算法中什么时候用return啥时候不用呢? 使用2个例子来说明:快速排序和二分查找 # 二分查找def binarySearch (arr, l, r, x): # 基本判断 if r >= ...

  5. C#内嵌Python架构实现

    C#通过IronPython内嵌Python脚本,实现了对业务逻辑抽象及判断,适合在大量订单需要进行校验的场合使用. 比如,贷款时会对用户进行核查,核查过程可能存在多个节点,并且节点可能会随着政策而不 ...

  6. autocad 2015 破解方法

    下载 http://trial.autodesk.com/SWDLDNET4/2015/ACD/DLM/AutoCAD_2015_Simplified_Chinese_Win_64bit_dlm.sf ...

  7. 第一周 Largest Rectangle in a Histogram

    Language: 题目: Largest Rectangle in a Histogram Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  8. python调用tushare获取A股周线行情

    接口:weekly 描述:获取A股周线行情 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare模块下载和安装教程,请查阅我 ...

  9. 看官方文档学习springcloud搭建

    很多java的朋友学习新知识时候去百度,看了之后一知半解,不知道怎么操作,不知道到底什么什么东西,那么作为java码农到底该怎么学习额 一  百度是对还是错呢? 百度是一个万能的工具,当然是对也是错的 ...

  10. python--面向对象:继承

    继承是创建新类的方式,新建的类可以继承多个父类(python里),父类又称为基类和超类,新建的类又称为派生类和子类 如果没有基类,python默认继承object祖类,object是所有类的基类 一. ...