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的个数的数字的个数... 分析 ...
随机推荐
- firefox 自定义快捷键
firefox 更新到44或45,发现原来的更改快捷键的扩展没了!!!
- 服务器迁移之debian重新配置Web服务的细节
之前配置Linux服务器时采用的是Debian系统一直很稳定,这次准备迁移到新的服务器环境上,好在以前的配置我在博客都做了备忘,所以很容易就搞定了,这次服务系统采用的是最新的Debian 7.0,但是 ...
- php语法检查方法——命令行模式和代码形式
1. 命令行形式 php -l /path/to/file.php 2. php代码形式 function php_syntax_check($file){ $code = file_get_cont ...
- 关于maven参数过滤
一.maven通过设置过滤器,可以使maven在编译打包时实现参数过滤的功能(详细配置说明略) <filters> <filter>../antx.properties< ...
- UTF8后MD5
function ToUTF8Encode(str: string): string; //将字符串转UTF8编码 var b: Byte; begin for b in BytesOf(UTF8En ...
- Python遍历路径下所有文件
开始学Python,这篇文章来自于应用需求. os.walk很方便,下面写了两个版本的函数进行遍历,分别是不使用walk和使用walk的. import sys import string impor ...
- Oracle监听器—静态注册
注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库.这个服务名可能与实例名一样,也有可能不一样. 注册分: 1. 静 ...
- Java 多线程 简单实例 (消费者与生成者)的关系
PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习: PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧! 1.定义生产消费环境 package second; pub ...
- tableView的基本使用(改良版)
@interface ViewController ()<UITableViewDataSource, UITableViewDelegate> { int i;//用来计算接受通知的次数 ...
- SpringMVC注解@RequestParam(转)
鸣谢:http://shawnccx.iteye.com/blog/730239 -------------------------------------------------- 在SpringM ...