题目大意:

给定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. shell重定向的顺序问题

    三个默认的文件描述符 0: stdin(标准输入) 1: stdout(标准输出) 2: stderr(标准错误输出) 系统中这3个文件描述符所对应的文件: 重定向顺序 示例脚本 echo " ...

  2. diji模板

    void diji(int x){ fill(dis,dis+n,INT_MAX); dis[x] = ; ;i < n;i++) pre[i] = i; ){ int minn = INT_M ...

  3. JAVA的IO流下载音乐

    public class DownloadMusic { private static int count = 1; public static void main(String[] args) th ...

  4. vbs 之 解决打开Excel文件格式与扩展名指定格式不一致的问题

    ' Q:解决打开Excel文件格式与扩展名指定格式不一致的问题' A: 使用工作簿saveAs时,往往忽略掉它的第二个参数FileFormat,添加即可. 比如: set bookDiff = oEx ...

  5. 你真的懂return吗?

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

  6. 前端(十二)—— JavaScript基础操作:if语句、for循环、while循环、for...in、for...of、异常处理、函数、事件、JS选择器、JS操作页面样式

    JavaScript基础操作 一.分支结构 1.if语句 if 基础语法 if (条件表达式) { 代码块; } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通 ...

  7. JUC源码分析-线程池篇(一):ThreadPoolExecutor

    JUC源码分析-线程池篇(一):ThreadPoolExecutor Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池 ...

  8. CSS 案例学习

    1.样式 display:inline-block;可改变a标签,合其可定义宽高 2.a:hover表示鼠标经过 3.background:url(110.png) bottom 表示:给链接一个图片 ...

  9. 新建pc端页面的模板

    pc端页面,要做兼容.新建pc端模板时,先要初始化浏览器的样式,我命名为reset.css @charset "utf-8"; /* 取消链接高亮 */ body,div,ul,l ...

  10. hdu6396 /// fread()快速读入挂

    题目大意: 给定n k 给定主角具有的k种属性 给定n个怪兽具有的k种属性和打死该怪兽后能得到的k种属性对应增幅 求主角最多能打死多少怪兽和最终主角的k种属性 k最大为5 开5个优先队列贪心 快速读入 ...