正题


大意

求一个闭区间内二进制0的个数大于等于1的个数的数的数量。


解题思路

我们将二进制考虑成01串
我们先不考虑有前导零的情况:
在kkk个空位中放i" role="presentation" style="position: relative;">iii个0,别的都放1的方案数为CikCkiC_k^i(我们将一个位置放0表示成取出这个位置的数)。
然后我们可以先计算1∼r1∼r1\sim r,然后减去1∼l−11∼l−11\sim l-1就是l∼rl∼rl\sim r这个区间内的数量。
我们考虑计算:
如一个数121212,我们将它转换为二进制100101001010010。我们先计算1∼100001∼100001\sim 10000中的数量,我们可以先枚举位数,然后我们保证第一位是1后后面的就是在剩余空位中放置满足个数要求的情况。
然后我们开始考虑后面的,我们可以发现如果我们从大到小枚举到一位数是111,那么如果我们将其改为0" role="presentation" style="position: relative;">000然后后面无论如何填入都无需考虑大小,所有我们可以利用这个性质计算,如果是111就该为0" role="presentation" style="position: relative;">000统计答案,之后该回11<script type="math/tex" id="MathJax-Element-2245">1</script>继续往后(因为这个位数是0的情况都计算完了)。


Code

#include<cstdio>
#include<cmath>
#define ll long long
#define find_c(x,y) c[x+1][y+1]
#define w 31
using namespace std;
ll first,second,c[w+2][w+2],f[w+2];
void make_C()
{c[1][1]=1;c[2][1]=1;c[2][2]=1;for (ll i=3;i<=w+1;i++)for (ll j=1;j<=i;j++)c[i][j]=c[i-1][j]+c[i-1][j-1];//预处理组合数
}
int answer(ll x,ll y)//计算在k个位中填01并且前面已经有y个1的合法情况总数
{int ans=0;for (int i=0;i<=x;i++)if (i>=x-i+y)//满足条件ans+=find_c(x,i);//计算答案return ans;
}
int work(ll x)
{if (x==0) return 0;ll k=log2(x)+1,ans=0,now=1,one=1;for (int i=1;i<k;i++)ans+=answer(i-1,1),now<<=1;//计算答案k--;now>>=1;//无视第一位(前面已经计算过了)while(k){if (x&now) ans+=answer(k-1,one-1),one+=1;//可以计算答案else one-=1;//统计零一个数k--;now>>=1;//下一位}if (one<=0) ans++;//判断本身是否满足要求return ans;
}
int main()
{make_C();scanf("%d%d",&first,&second);printf("%d",work(second)-work(first-1));
}

jzoj1265-Round Numbers【数位统计】相关推荐

  1. POJ - 3252 Round Numbers(数位dp)

    题目链接:点击查看 题目大意:规定一个数如果二进制中0的个数大于等于1的个数,则这个数称为"整数",问闭区间a,b中有多少个整数 题目分析:数位dp,dp[pos][c0][c1] ...

  2. 牛客假日团队赛5 F 随机数 BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 (dfs记忆化搜索的数位DP)...

    链接:https://ac.nowcoder.com/acm/contest/984/F 来源:牛客网 随机数 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  3. Round Numbers POJ - 3252(数位dp+判断前导零)

    题意 求二进制表示中0的个数大于1的数的个数. 题目 The cows, as you know, have no fingers or thumbs and thus are unable to p ...

  4. BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)

    BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Description 正如你所知 ...

  5. bzoj 1662: [Usaco2006 Nov]Round Numbers 圆环数(枚举)

    1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 413  Solved: 2 ...

  6. 数位统计 dp 问题

    数位统计 dp 文章目录 数位统计 dp @[toc] 简介 解决的问题 写法 递推 记忆化搜索 例题 例题 统计问题 The Counting Problem [P4124 [CQOI2016]手机 ...

  7. 数据范围BZOJ 3209(花神的数论题-数位统计+1,被数据范围坑了)

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 3209: 花神的数论题 Time Limit: 10 Sec Memory ...

  8. Codeforces 55D Beautiful Number (数位统计)

    把数位dp写成记忆化搜索的形式,方法很赞,代码量少了很多. 下面为转载内容:  a positive integer number is beautiful if and only if it is  ...

  9. Round Numbers

    题意/Description: 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁先挤奶的顺序.她们甚至也不能通过仍硬币的方式.        所以她们通过&q ...

  10. 1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 337 Solved:

    1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 337  Solved: 1 ...

最新文章

  1. [转]30个HTML5学习资源
  2. Samba 4.10 发布,完全支持 Python 3
  3. Xftp连接到Linux服务器时提示连接失败的配置
  4. Toping Kagglers:Bestfitting,目前世界排名第一
  5. 从零开始学视觉Transformer(1):Hello Vision Transformer
  6. python-索引1909
  7. Python如何创建装饰器时保留函数元信息
  8. VB 几种打开文本文件速度对比
  9. OpenMP 并行程序设计入门
  10. 探讨 .NET 语言的 using statement 与资源释放
  11. JavaScript高级程序设计(第三版)pdf的下载地址
  12. 第十八期 Amesim视频教程热交换器建模仿真专题
  13. lg v35 thinkq刷韩版android9.0教程
  14. jsonrpc java_jsonrpc环境搭建和简单实例
  15. cd linux 官网,cdlinux
  16. 优化模型验证关键代码06:多行程旅行商问题(mTSP)
  17. 联邦学习:加密算法Paillier,Affine,IterativeAffine
  18. 计算机无法识别点读笔,点读笔插电脑上不识别
  19. Uniswap V2-Core 部分智能合约代码解析
  20. 浅谈软件定制开发与软件外包的区别

热门文章

  1. wenstorm设置谷歌_WebStorm+Chrome调试Vue步骤
  2. mysql 碎片率_MySQL数据碎片的整理和分析
  3. java nature_Java Nature.nsf方法代码示例
  4. dataset的去重计数 g2_ExcelExcel去重、计数一步到位,这个方法简单到哭
  5. 39. 组合总和020(思路+详解)
  6. CoreJava 笔记总结-第六章 接口、lambda表达式与内部类
  7. 算法---宝藏最优选择问题
  8. matlab处理中文路径
  9. 牛客题霸 [字符串变形]C++题解/答案
  10. 牛客网【每日一题】7月29日题目精讲—Max Power