好了,我的数论渣爆了…………

首先[n,m]内的round number显然就是f[m]-f[n-1]

即问0~x内有多少round number;

设x的二进制位数为t;

首先很好分析出在这个范围

若某数的二进制位数<t,则首位1不动,后面组合即可;

然后被卡在当二进制位数为t的round number有多少这招情况;

后来看了别人的解题报告才恍然大悟;

对于x,不算首位的1,只要把当前某一个1改成0,并对后面位数重新01组合就一定小于x,

于是

对于x的每一位1,对后面重新组合即可

显然最终答案不会爆maxlongint

现在想想,其实就是数位dp的思想

 var c:array[..,..] of longint;
    a:array[..] of longint;
    n,m:longint;
procedure prepare;  //预处理组合数
  var i,j:longint;
  begin
    c[,]:=;
    for i:= to do
    begin
      c[i,]:=;
      c[i,i]:=;
      for j:= to i- do
        c[i,j]:=c[i-,j]+c[i-,j-];
    end;
  end; function count(x:longint):longint;
  var p,t,i,j,q,s1,s0:longint;
  begin
    fillchar(a,sizeof(a),);
    if x= then exit();
    p:=x;
    t:=;
    while p<> do                  //十转二
    begin
      t:=t+;
      a[t]:=p mod ;
      p:=p shr ;
    end;
    count:=;                     //考虑0
    for i:= to t- do            //当二进制位数小于t
    begin
      if i mod = then q:=(i-) div +    //保证0比1多
      else q:=i div ;
      for j:=q to i- do
        count:=count+c[i-,j];
    end;
    s0:=;
    s1:=;
    for i:= to t do              //先特判x是否是round number    
      if a[i]= then inc(s1) else inc(s0);
    if s0>=s1 then count:=count+;
    s0:=;
    s1:=;
    for i:=t- downto do      
      if a[i]= then
      begin
        for j:=i- downto do       //j表示后面可能出现0的个数
          if j+s0+>=i--j+s1 then  //保证0比1多,i-表示当前位1后面的,+表示将这位1变成0后后面重新组合
            count:=count+c[i-,j]
          else break;
        inc(s1);                   //别忘统计前面的0,个数,后面的排列情况是由起决定的
      end
      else inc(s0);
  end;
begin
  readln(n,m);
  prepare;
  writeln(count(m)-count(n-));      //经常用到的转化思想
end.

poj3252的更多相关文章

  1. [BZOJ1662][POJ3252]Round Numbers

    [POJ3252]Round Numbers 试题描述 The cows, as you know, have no fingers or thumbs and thus are unable to ...

  2. POJ3252——Round Number(组合数学)

    Round Numbers DescriptionThe cows, as you know, have no fingers or thumbs and thus are unable to pla ...

  3. [poj3252]Round Numbers_数位dp

    Round Numbers poj3252 题目大意:求一段区间内Round Numbers的个数. 注释:如果一个数的二进制表示中0的个数不少于1的个数,我们就说这个数是Round Number.给 ...

  4. POJ3252 Round Numbers 【数位dp】

    题目链接 POJ3252 题解 为什么每次写出数位dp都如此兴奋? 因为数位dp太苟了 因为我太弱了 设\(f[i][0|1][cnt1][cnt0]\)表示到二进制第\(i\)位,之前是否达到上界, ...

  5. poj3252(数位dp)(模板)

    题目链接:https://vjudge.net/problem/POJ-3252 题意:求[l,r]之间的Round Number数,RN数即化为二进制后0的个数不少于1的个数的数. 思路:之前用组合 ...

  6. POJ3252 Round Numbers(不重复全排列)

    题目问区间有多少个数字的二进制0的个数大于等于1的个数. 用数学方法求出0到n区间的合法个数,然后用类似数位DP的统计思想. 我大概是这么求的,确定前缀的0和1,然后后面就是若干个0和若干个1的不重复 ...

  7. poj3252 Round Numbers

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7625   Accepted: 2625 Des ...

  8. poj3252 组合数学

    题目大意:给两个数字a,b求出[a,b]中转化成二进制后0的个数大于等于1的个数的数 例如1100转化成10-11,100-111,1000-1011,1100.保证每个区段都有1打头,然后有一段数字 ...

  9. poj3252(数位dp)

    题目连接:http://poj.org/problem?id=3252 题意:拆成2进制,在记录0和1的个数 求区间[a,b]中,满足传化成2进制后,0的个数>=1的个数的数字的个数... 分析 ...

随机推荐

  1. FIFO、LRU、OPT这三种置换算法的缺页次数

    考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6 当内存块数量分别为3时,试问FIFO.LRU.OPT这三种置换算法的缺页次数各是多少? 答:缺页定义 ...

  2. 制作复选框(Toggle)

    怎样判断是否应当使用复选框 复选框,就是对一个选项做上一个标记,表示这个选项已经被选中了.在游戏中,复选框一般用来做一些选项的控制,这种选项一般都只有两种答案:是和否.例如,单击一下开启音乐的复选框, ...

  3. ios 8和iOS 9 适用的uidatepicker

    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"\n\n\n\n\n\n ...

  4. Hibernate关系级别注解

    最近在学习Hibernate的相关知识,这一站学习的是Hibernate的注解相关的操作和知识.在这里标注以下为以后查阅和需要帮助的朋友提供便利. 一. 开发环境的搭建: 1. 需要的jar包配置: ...

  5. Jmeter 使用实践 - 接口 diff 测试

    大多数人都使用 Jmeter 做过性能测试,但是在使用的过程中你会发现,它不仅可以做性能测试和功能测试,还能够满足基本的接口测试需求. 相比其他工具,Jmeter 入门门槛较低,安装也比较方便,根据自 ...

  6. Zookeeper + Hadoop + Hbase部署备忘

    网上类似的文章很多,本文只是记录下来备忘.本文分四大步骤: 准备工作.安装zookeeper.安装hadoop.安装hbase,下面分别详细介绍: 一 准备工作 1. 下载 zookeeper.had ...

  7. socket编程中write、read和send、recv之间的区别

    http://blog.csdn.net/petershina/article/details/7946615 一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用. 由此网络 ...

  8. FileZilla Server 防火墙端口开启设置 windows 2008 win

    入站规则 添加21端口, 程序FileZilla server.exe 出站规则 %SystemRoot%\System32\ftp.exe

  9. SQLite入门与分析(四)---Page Cache之事务处理(3)

    写在前面:由于内容较多,所以断续没有写完的内容. 11.删除日志文件(Deleting The Rollback Journal)一旦更改写入设备,日志文件将会被删除,这是事务真正提交的时刻.如果在这 ...

  10. MAC下编译FFMPEG

    1.下载ffmpeg,我使用xcode自带的git下载. 或者直接下载压缩包: 2.下载gas-preprocessor脚本 https://raw.github.com/mansr/gas-prep ...