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 ...
随机推荐
- C#中的this关键字
C# this关键字的四种用法 - 天碼行空 - 博客园 https://www.cnblogs.com/jh007/p/6120654.html C#中this关键字详解 - lin37985的专栏 ...
- 响应断言和json asstion
1.要勾选Additionallly assert value才可以输入下面的预期结果哦
- windows平板软件开机自启动+霸屏的操作方法
转载(忘了地址) 很好很强大.成功亲测 使用你自己的账号(最好是管理员权限的账号)登录Windows,然后添加一个给其他人使用的账户(假设为other),注意一定要为other设置密码. 运行 ...
- element ui设置表格表头高度和每一行的高度
填坑记录:今天用element ui的表格组件做用户信息展示,直接拉取的官网的代码过来,发现表头和每一行都太高了,如下: 因为第一次使用element ui的表格组件,不太清楚会遇到这样的坑,以为能轻 ...
- 上线出现[x86_64, i386]
echo "Target architectures: $ARCHS" APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}&quo ...
- MySQL 小调研
一. 概况: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL ...
- one-hot encoding与哑变量的区别
one-hot encoding与哑变量的区别 one-hot比哑变量的特征位多一位,即哑变量是精简版的one-hot,即在线性回归中用截距项来表示最后一维,但由于最初很难分辨特征的主次关系,且机器学 ...
- (转载)openwrt nginx
ln -s ../../../feeds/packages/net/fcgiwrap/ fcgiwrap 本帖最后由 cjd6568358 于 2018-6-4 11:21 编辑 刚又把路由器重置重新 ...
- Grafana + Influxdb Android性能监控部署
目录 前言 一.前提准备 二.安装 Grafana 三.安装 Influxdb 四.Grafana 添加 Influxdb 数据源 五.Shell 脚本写入数据到 Influxdb 前言 你是否为了数 ...
- SP2713 GSS4 - Can you answer these queries IV(线段树)
传送门 解题思路 大概就是一个数很少次数的开方会开到\(1\),而\(1\)开方还是\(1\),所以维护一个和,维护一个开方标记,维护一个区间是否全部为\(1/0\)的标记.然后每次修改时先看是否有全 ...