题目链接: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. Swift应用案例 2.闭包入门到精通

      本文主要介绍Swift的闭包的使用并与OC的Block做比较.学习Swift是绕不过闭包的,因为无论是全局函数还是嵌套函数都是闭包的一种,本文主要介绍闭包表达式. 1.闭包表达式的使用 // 1. ...

  2. 日期格式化,moment.js

    官方文档:http://momentjs.com/; 使用方法:moment(data).format("YYYY-MM-DD");//data为日期的字符串形式 moment() ...

  3. css3圆环闪烁动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Object-C知识点

    Object-C常用的知识点,以下为我在实际开发中用到的知识点,但是又想不起来,需要百度一下的知识点 1. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: ...

  5. POPTEST老李谈Debug和Release的区别(c#)2

    二.哪些情况下 Release 版会出错 有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的 1. Runtime Library: 2. 优化:这类错误主要有以下几种: ...

  6. 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer

    老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer   poptest是国内唯一一家培养 ...

  7. number问题

    Missing Number Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one ...

  8. 云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core

    在昨天的博文中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法. 帐户 连接数 A 4077 B 3995 C 741 D 698 E ...

  9. EM最大期望算法-走读

    打算抽时间走读一些算法,尽量通俗的记录下面,希望帮助需要的同学.   overview: 基本思想:      通过初始化参数P1,P2,推断出隐变量Z的概率分布(E步):      通过隐变量Z的概 ...

  10. [UWP]了解模板化控件(5):VisualState

    1. 功能需求 使用TemplatePart实现上篇文章的两个需求(Header为空时隐藏HeaderContentPresenter,鼠标没有放在控件上时HeaderContentPresent半透 ...