poj3252
好了,我的数论渣爆了…………
首先[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的更多相关文章
- [BZOJ1662][POJ3252]Round Numbers
[POJ3252]Round Numbers 试题描述 The cows, as you know, have no fingers or thumbs and thus are unable to ...
- POJ3252——Round Number(组合数学)
Round Numbers DescriptionThe cows, as you know, have no fingers or thumbs and thus are unable to pla ...
- [poj3252]Round Numbers_数位dp
Round Numbers poj3252 题目大意:求一段区间内Round Numbers的个数. 注释:如果一个数的二进制表示中0的个数不少于1的个数,我们就说这个数是Round Number.给 ...
- POJ3252 Round Numbers 【数位dp】
题目链接 POJ3252 题解 为什么每次写出数位dp都如此兴奋? 因为数位dp太苟了 因为我太弱了 设\(f[i][0|1][cnt1][cnt0]\)表示到二进制第\(i\)位,之前是否达到上界, ...
- poj3252(数位dp)(模板)
题目链接:https://vjudge.net/problem/POJ-3252 题意:求[l,r]之间的Round Number数,RN数即化为二进制后0的个数不少于1的个数的数. 思路:之前用组合 ...
- POJ3252 Round Numbers(不重复全排列)
题目问区间有多少个数字的二进制0的个数大于等于1的个数. 用数学方法求出0到n区间的合法个数,然后用类似数位DP的统计思想. 我大概是这么求的,确定前缀的0和1,然后后面就是若干个0和若干个1的不重复 ...
- poj3252 Round Numbers
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7625 Accepted: 2625 Des ...
- poj3252 组合数学
题目大意:给两个数字a,b求出[a,b]中转化成二进制后0的个数大于等于1的个数的数 例如1100转化成10-11,100-111,1000-1011,1100.保证每个区段都有1打头,然后有一段数字 ...
- poj3252(数位dp)
题目连接:http://poj.org/problem?id=3252 题意:拆成2进制,在记录0和1的个数 求区间[a,b]中,满足传化成2进制后,0的个数>=1的个数的数字的个数... 分析 ...
随机推荐
- 图片grayscale(灰阶效果)webkit内核支持。
filter:gray;-webkit-filter: grayscale(100%); 置为灰阶等hove时候 -webkit-filter: grayscale(0%);显示出彩色.
- linux 学习笔记2
vi 编辑命令并查看 i 插入 esc 转换模式 shift + : x 保存并退出 q 不保存 !强制保存 五个查看命令 cat / less / more / tail / hea ...
- AngularJs--过滤器(filter)
过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...
- CodeBlocks去掉拼写检查
打开: 选择Compiler... 将红框里面的勾都点掉即可!
- 使用NPIO操作Excel
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...
- 分类-Category
1.基本用途 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 继承 分类(Category) 2.格式 分类的声明 @interface 类名 (分类名称) // 方法声明 @end 分 ...
- 高仿猫眼电影选座(选票)模块-b
上图看效果先: 1)画座位图其实不是很难一般数据都会给坐标,将坐标对应座位画出来就可以了,主要是开场动画要设置默认大小,还有座位图的数量也不是固定的,所以在初始化座位图的时侯就默认算出了整个座位图的大 ...
- [转载]mvc使用JsonResult返回Json数据
controller 中定义以下方法: public JsonResult UpdateSingle(int id, string actionName, string actionValue) { ...
- python:UnicodeEncodeError
problem: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'[taobao_cocobe ...
- 1027-Quicksum
描述 A checksum is an algorithm that scans a packet of data and returns a single number. The idea is t ...