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

首先[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. 图片grayscale(灰阶效果)webkit内核支持。

    filter:gray;-webkit-filter: grayscale(100%); 置为灰阶等hove时候 -webkit-filter: grayscale(0%);显示出彩色.

  2. linux 学习笔记2

    vi  编辑命令并查看 i 插入 esc  转换模式 shift + : x  保存并退出    q  不保存  !强制保存 五个查看命令 cat / less / more / tail / hea ...

  3. AngularJs--过滤器(filter)

    过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...

  4. CodeBlocks去掉拼写检查

    打开: 选择Compiler... 将红框里面的勾都点掉即可!

  5. 使用NPIO操作Excel

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...

  6. 分类-Category

    1.基本用途 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 继承 分类(Category) 2.格式 分类的声明 @interface 类名 (分类名称) // 方法声明 @end 分 ...

  7. 高仿猫眼电影选座(选票)模块-b

    上图看效果先: 1)画座位图其实不是很难一般数据都会给坐标,将坐标对应座位画出来就可以了,主要是开场动画要设置默认大小,还有座位图的数量也不是固定的,所以在初始化座位图的时侯就默认算出了整个座位图的大 ...

  8. [转载]mvc使用JsonResult返回Json数据

    controller 中定义以下方法: public JsonResult UpdateSingle(int id, string actionName, string actionValue) { ...

  9. python:UnicodeEncodeError

    problem: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'[taobao_cocobe ...

  10. 1027-Quicksum

    描述 A checksum is an algorithm that scans a packet of data and returns a single number. The idea is t ...