题目链接:http://poj.org/problem?id=3252

题目大意:

  输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个Round number

  所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制数中0的个数大于等于1的个数,则它就是一个Round Number

  规定输入范围: 1<= a <b<=2E

/*

一开始错在计算组合数!!!正解是利用杨辉三角来算!!
另外对于star=1的情况下也需要特判一下子
思路是算出【0,star】和【0,fini】的round number(以下简称rn)个数,后者减去前者+1*【star是rn】(艾弗森约定)
要计算【0,a】的rn个数,设a的二进制表示长度为lena,那么先打表f[]给出二进制表示数长度为1-->lena-1的这些数的rn。
再计算长度为lena的,但是比a小的这些数里头有哪些是rn呢?
计算同长度的rn的思路是:从高位到低位将a的二进制表示中的1(除最高位)逐次变为0,更低位的则在满足rn条件的前提下随便进行排列,得到的数一定是小于a的rn
当然某一位变完了以后又会变回来的啊。这部分详见fun();

*/

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define MAX 35
#define unsigned int long long
long long f[MAX];
long long star,fini;
char str0[],str1[];
long long c[][];
void d2b(long long d, char *str)//十进制转成二进制!
{
int nStart = -, i = ;
for (i=; i<; i++)
{
bool bOne = ( != (d & ( << (-i-) )));
if (bOne && nStart < )
{
nStart = i;
}
if(nStart>=)
{
str[i - nStart] = bOne ? '' : '';
}
}
str[i - nStart] = '\0';
return ;
} long long pow3( long long a, long long b )//快速幂
{
long long r = , base = a;
while( b != )
{
if( b & )
r *= base;
base *= base;
b >>= ;
}
return r;
} void play_table(void)//计算组合数的!
{
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
if(!j || i==j)
c[i][j]=;
else
c[i][j]=c[i-][j-]+c[i-][j];
return;
} void Cf()//计算f[]
{
f[]=;
for(int i=;i<MAX;i++){
int k=i/;
if(i%)
f[i]=(pow3(,*k)-c[*k][k])/;
else
f[i]=pow3(,k-);
}
} long long fun(char ss[])
{
int sum0=;//ss中0的个数。
int len=strlen(ss);
long long ans=;
for(int i=;i<len;i++)
ans+=f[i];
for(int k=;k<len;k++)
{
if(ss[k]=='')
sum0++;
else
{
int t0=ceil(1.0*len/)-sum0-;//至少需要的0个数
int s=len-k-;//剩下的可变位数
if(t0<=)
ans+=pow3(,s);
else
if(t0<=s)
for(int i=t0;i<=s;i++)
ans+=c[s][i];//(s,i);
}
}
if(sum0>=ceil(1.0*len/))//相当于本身
ans++;
return ans;
} bool ok(char s[])
{
int sum0=;
int len=strlen(s);
if(strcmp(s,"")==)
return ;
for(int i=;i<len;i++)
if(s[i]=='')
sum0++;
if(sum0>=ceil(1.0*len/))
return ;
return ;
} int main()
{
play_table();
Cf();
while(cin>>star>>fini)
{
d2b(star,str0);
d2b(fini,str1);
if(star==) ans0++;//对1进行特判
if(ok(str0))
cout<<fun(str1)-fun(str0)+<<endl;
else
cout<<fun(str1)-fun(str0)<<endl;
}
return ;
}

POJ3252-Round Numbers 数学的更多相关文章

  1. [BZOJ1662][POJ3252]Round Numbers

    [POJ3252]Round Numbers 试题描述 The cows, as you know, have no fingers or thumbs and thus are unable to ...

  2. POJ 3252 Round Numbers 数学题解

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

  3. poj3252 Round Numbers

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7625   Accepted: 2625 Des ...

  4. POJ3252 Round Numbers —— 数位DP

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

  5. poj3252 Round Numbers(数位dp)

    题目传送门 Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16439   Accepted: 6 ...

  6. poj3252 Round Numbers (数位dp)

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

  7. POJ3252 Round Numbers(不重复全排列)

    题目问区间有多少个数字的二进制0的个数大于等于1的个数. 用数学方法求出0到n区间的合法个数,然后用类似数位DP的统计思想. 我大概是这么求的,确定前缀的0和1,然后后面就是若干个0和若干个1的不重复 ...

  8. POJ3252 Round Numbers 【数位dp】

    题目链接 POJ3252 题解 为什么每次写出数位dp都如此兴奋? 因为数位dp太苟了 因为我太弱了 设\(f[i][0|1][cnt1][cnt0]\)表示到二进制第\(i\)位,之前是否达到上界, ...

  9. poj3252 Round Numbers[数位DP]

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

  10. POJ3252 Round Numbers 题解 数位DP

    题目大意: 求区间 \([x,y]\) 范围内有多少数的二进制表示中的'0'的个数 \(\ge\) '1'的个数. 解题思路: 使用 数位DP 解决这个问题. 我们设状态 f[pos][num0][n ...

随机推荐

  1. git 远程仓库管理

    要参与任何一个 Git 项目的协作,必须要了解该如何管理远程仓库.远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些可以写.同他人协作开发某 个项目时,需要管理这些远程仓库 ...

  2. python文件读写出现乱码总结

    1.错误的打开方式 #coding=utf-8f = open("test.txt",'w+')f.write('Mars is slim,isn\'he? \n 火星教')pri ...

  3. [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)

    一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...

  4. 第1章1zabbix快速入门

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...

  5. 设计模式(二)—工厂方法模式

         凡是出现了大量的实例需要创建,而且具有共同的接口时,可以通过工厂方法模式进行创建. 一个接口: Sender public interface Sender{ public void sen ...

  6. GPIO寄存器

    GPIO寄存器描述 <STM32参考手册中文-p75> 1.端口配置低寄存器(GPIOx_CRL)(x = A...E)2.端口配置高寄存器(GPIOx_CRH)(x = A...E) 3 ...

  7. 利用原生JS判断组合键

    <script type="text/javascript"> var isAlt = 0; var isEnt = 0; document.onkeydown = f ...

  8. webpack搭建服务器,随时修改刷新

    前提:1.对webpack有一定了解,本文不做介绍 2.安装node.js 手把手操作: 1.创建一个名为webpack-server的文件夹(随便取的) 2.cd到当前文件夹:cd webpack- ...

  9. 在eclipse中使用Maven建web工程项目

    在eclipse中使用Maven建web工程项目: 第一种方式: 右键新建maven工程,勾选创建一个简单工程 填入信息,注意打包方式要改为war 点击完成,创建完的工程目录如下: 项目中没有WEB- ...

  10. SSE 系列内置函数中的 shuffle 函数

    SSE 系列内置函数中的 shuffle 函数 邮箱: quarrying@qq.com 博客: http://www.cnblogs.com/quarryman/ 发布时间: 2017年04月18日 ...