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. 【Docker】1、 前后端分离项目 下载启动运行

    人人开源前后端分离项目下载与配置 文章目录 人人开源前后端分离项目下载与配置 前后端分离框架介绍 后端项目下载与配置 1.renren-fast后台项目介绍 2.开发环境搭建 3.下载后端renren ...

  2. 【Git】4、创建代码仓库,HTTP、SSH拉取远端代码

    拉取远端代码:使用Git命令下载远程仓库到本地 文章目录 拉取远端代码:使用Git命令下载远程仓库到本地 1.创建远程代码仓库 2.创建仓库 3.进入仓库 4.HTTP(S)获取远程仓库 首次拉取 更 ...

  3. 关于阿里云服务器安装了Apache开放80端口访问不了网页

    先用netstat -tlunp查看80端口是否打开,再关闭服务器的防火墙,可以用 systemctl status firewalld 查看防火墙状态  systemctl stop firewal ...

  4. Java集合List-差集、并集、交集

    Java集合List的差集.并集.交集 转载于:https://www.cnblogs.com/qlqwjy/p/9812919.html 一.List的差集 @Test public void te ...

  5. InnoDB的主键选择与插入优化

    索引的存放方式MyISAM和InnoDB存储引擎在MySQL中,不同存储引擎对索引的实现方式是不同的,总结下MyISAM和InnoDB两个存储引擎的索引实现方式.MyISAM引擎使用B+Tree作为索 ...

  6. 转 8 jmeter之集合点

    8 jmeter之集合点   集合点:集合点用以同步虚拟用户,以便恰好在同一时刻执行任务.在测试计划中,可能会要求系统能够承受1000 人同时提交数据,在LoadRunner 中可以通过在提交数据操作 ...

  7. Linux中LPC、RPC、IPC的区别

    其实这玩意儿就是纸老虎,将英文缩写翻译为中文就明白一半了. IPC:(Inter Process Communication )跨进程通信 这个概念泛指进程之间任何形式的通信行为,是个可以拿来到处套的 ...

  8. 自导自演的面试现场,趣学MySQL的10种文件

    导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"自导自演的数据库面试现场--谈谈MySQL的10种文件" 换一种写作风格 ...

  9. WPF TabControl美化

    <Window.Resources> <!-- TabItem的样式 --> <Style TargetType="{x:Type TabItem}" ...

  10. PB 级大规模 Elasticsearch 集群运维与调优实践

    PB 级大规模 Elasticsearch 集群运维与调优实践 https://mp.weixin.qq.com/s/PDyHT9IuRij20JBgbPTjFA | 导语 腾讯云 Elasticse ...