Description

The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) in order to make arbitrary decisions such as who gets to be milked first.
They can't even flip a coin because it's so hard to toss using hooves.

They have thus resorted to "round number" matching. The first cow picks an integer less than two billion. The second cow does the same. If the numbers are both "round numbers", the first cow wins,

otherwise the second cow wins.

A positive integer N is said to be a "round number" if the binary representation of N has as many or more zeroes than it has ones. For example, the integer 9, when written in binary form, is 1001. 1001 has two zeroes and two ones; thus,
9 is a round number. The integer 26 is 11010 in binary; since it has two zeroes and three ones, it is not a round number.

Obviously, it takes cows a while to convert numbers to binary, so the winner takes a while to determine. Bessie wants to cheat and thinks she can do that if she knows how many "round numbers" are in a given range.

Help her by writing a program that tells how many round numbers appear in the inclusive range given by the input (1 ≤ Start < Finish ≤ 2,000,000,000).

Input

Line 1: Two space-separated integers, respectively Start and Finish.

Output

Line 1: A single integer that is the count of round numbers in the inclusive range Start..Finish

Sample Input

2 12

Sample Output

6

题意:一个数位round数,要满足这个数化成二进制后0的个数大于等于1的个数。

思路:先预处理出dp[i][j]表示前i位有j个0的方案数,然后从高位到低位数位dp就行了。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
#define maxn 805
ll dp[40][40];
void init()
{
int i,j;
memset(dp,0,sizeof(dp));
dp[1][1]=1;dp[1][0]=1;
for(i=1;i<=32;i++){
for(j=0;j<=i;j++){
dp[i+1][j]+=dp[i][j];
dp[i+1][j+1]+=dp[i][j];
}
}
} ll solve(int x)
{
int i,j,t=x;
int wei[40],len=0;
while(t){
wei[++len]=t%2;
t/=2;
} ll sum=0;
int num0=0,num1=0;
for(i=len-1;i>=1;i--){ //这里先把第len位变为0,然后一次枚举最高的位数在第i位
for(j=0;j<=i-1;j++){
if(j>=i-j)sum+=dp[i-1][j];
} } num1=1;
for(i=len-1;i>=1;i--){ //这里是在第len位为1的情况下进行dp
if(wei[i]==1){
if(i==1){
if(num0+1>=num1)sum++;
}
else{
for(j=0;j<=i-1;j++){
if(j+num0+1>=num1+i-1-j ){
sum+=dp[i-1][j];
}
}
}
num1++;
}
else num0++;
}
return sum;
}
int main()
{
int n,m,i,j;
init();
while(scanf("%d%d",&m,&n)!=EOF)
{
printf("%lld\n",solve(n+1)-solve(m));
}
return 0;
}

这题也可以用记忆化搜索做,搜索比直接dp要好些,而且用途广,写的时候在dfs中加一维zero,表示当前这一位是不是任然是前导0.用dp[pos][num0][num1]表示前pos位0的个数为num0,1的个数为num1方案数。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<bitset>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef long double ldb;
#define inf 99999999
#define pi acos(-1.0)
int dp[35][35][35];
int wei[35];
int dfs(int pos,int num0,int num1,int lim,int zero)
{
int i,j;
if(pos==0){
if(zero==0){ //这里不判断zero==0也可以,判不判断的区别在于是不是把0算上,判断就不把0算上了
if(num0>=num1)return 1;
else return 0;
}
return 0;
/*
if(num0>=num1)return 1;
return 0;
*/
}
if(lim==0 && dp[pos][num0][num1]!=-1){
return dp[pos][num0][num1];
} int ed=lim?wei[pos]:1;
int ans=0,nu0,nu1;
for(i=0;i<=ed;i++){
if(zero && i==0){
nu0=nu1=0;
}
else{
if(i==0){
nu0=num0+1;
nu1=num1;
}
else{
nu0=num0;
nu1=num1+1;
}
}
ans+=dfs(pos-1,nu0,nu1,lim&&i==ed,zero&&i==0 );
}
if(lim==0){
dp[pos][num0][num1]=ans;
}
return ans;
} int solve(int x)
{
int i,j,tot=0;
while(x){
wei[++tot]=x%2;
x/=2;
}
return dfs(tot,0,0,1,1);
} int main()
{
int n,m,i,j;
memset(dp,-1,sizeof(dp));
while(scanf("%d%d",&m,&n)!=EOF)
{
printf("%d\n",solve(n)-solve(m-1));
}
return 0;
}

poj3252 Round Numbers (数位dp)的更多相关文章

  1. POJ3252 Round Numbers —— 数位DP

    题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Su ...

  2. poj3252 Round Numbers[数位DP]

    地址 拆成2进制位做dp记搜就行了,带一下前导0,将0和1的个数带到状态里面,每种0和1的个数讨论一下,累加即可. WA记录:line29. #include<iostream> #inc ...

  3. 【poj3252】 Round Numbers (数位DP+记忆化DFS)

    题目大意:给你一个区间$[l,r]$,求在该区间内有多少整数在二进制下$0$的数量$≥1$的数量.数据范围$1≤l,r≤2*10^{9}$. 第一次用记忆化dfs写数位dp,感觉神清气爽~(原谅我这个 ...

  4. [poj3252]Round Numbers_数位dp

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

  5. poj 3252 Round Numbers(数位dp 处理前导零)

    Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...

  6. 4-圆数Round Numbers(数位dp)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14947   Accepted: 6023 De ...

  7. POJ 3252 Round Numbers(数位dp&amp;记忆化搜索)

    题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...

  8. POJ - 3252 - Round Numbers(数位DP)

    链接: https://vjudge.net/problem/POJ-3252 题意: The cows, as you know, have no fingers or thumbs and thu ...

  9. Round Numbers(数位DP)

    Round Numbers http://poj.org/problem?id=3252 Time Limit: 2000MS   Memory Limit: 65536K Total Submiss ...

随机推荐

  1. 改进你的c#代码的5个技巧(三)

    本文完全独立于前两篇文章.如果你喜欢它们,我希望你也会喜欢这个.在上一篇文章中,我展示了哪种方法更快,并比较了代码的执行速度.在本文中,我将展示不同代码片段的内存消耗情况.为了显示内存映射和分配图,我 ...

  2. Laya 踩坑日记-人物模型穿模,模型显示不正常

    最近做游戏,人物要跑到很远的位置,z轴距离大概有20000个单位,然后就发现一个bug,到远处人物模型穿了,而且没办法改,这就尴尬了 Z轴对应值    0    100000 100000 当距离零点 ...

  3. 【C++】《Effective C++》第九章

    杂项讨论 条款53:不要轻忽编译器的警告 请记住 严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取"无任何警告"的容易. 不要过度依赖编译器的报警能力, ...

  4. 【Sphinx】 为Python自动生成文档

    sphinx 前言 Sphinx是一个可以用于Python的自动文档生成工具,可以自动的把docstring转换为文档,并支持多种输出格式包括html,latex,pdf等 开始 建一个存放文档的do ...

  5. LAN-SHARE 使用教程

    Description: 我的个人项目 LAN-Share 的使用教程:局域网内文件分享工具 LAN-Share 是一个基于 Node.js 的用于局域网内文件分享的工具,易于配置与部署. 项目地址: ...

  6. 【网络】trunk和vlan配置

    篇一 : trunk配置和vlan配置 trunk配置 Switch>enable ? ? ?//进入特权模式 Switch#conf t ? ? ?//进入配置模式 Switch(config ...

  7. C语言变量

    C语言变量 任何一种编程语言都离不开变量,特别是数据处理型程序,变量的使用非常频繁,没有变量参与程序甚至无法编制,即使编制运行后的意义也不大.变量之所以重要,是因为变量是编程语言中数据的符号标识和载体 ...

  8. MySQL全面瓦解18:自定义函数

    定义 我们之前学习了MySQL的内置函数,非常丰富,满足了我们对数据操作的大部分需求. 但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函 ...

  9. QT串口助手(二):参数配置

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 主要实现功能 串口参数的配置:波特率.数据位.停止位.校验位 本机串口设备的查询与添加显示 串口设备的手动更新与打 ...

  10. SQL Server 日志收缩方法

    在日常运维中,有时会遇到"The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'." ...