题目链接: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. SSH自动断开连接的原因、配置(转)

    方法一: 用putty/SecureCRT连续3分钟左右没有输入, 就自动断开, 然后必须重新登陆, 很麻烦. 在网上查了很多资料, 发现原因有多种, 环境变量TMOUT引起,ClientAliveC ...

  2. Shell中一键添加作者,版权信息

    第一步:编辑/etc/vimrc文件 [root@proxy ~]# cp /etc/vimrc /etc/vimrc.ori [root@proxy ~]# vim /etc/vimrc 第二步:直 ...

  3. salesforce中soql及sosl的伪‘Like’模糊检索

    salesforce里有soql.sosl两种查询语法,soql针对模糊搜索也有‘like’关键字,然而只能针对其自带字段如:Name.Id:对于自定义添加的字段如:Message__c.Note__ ...

  4. Node.js编程之异步

    异步操作 Node采用V8引擎处理JavaScript脚本,最大特点就是单线程运行,一次只能运行一个任务.这导致Node大量采用异步操作(asynchronous opertion),即任务不是马上执 ...

  5. 学习Jammendo代码的心路历程(一)简单的淡出效果实现

    最近在看 Jammendo代码,打算将学习过程简单的记录下来,下面开始第一篇: 打开Jammendo运行之后,出弹出一个对话框,跳过对话框之后,会有一个淡出界面跳转到首页效果的实现.那么这个效果是怎么 ...

  6. Apache Mina入门实例

    一.mina是啥 ApacheMINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的 ...

  7. python3基础之整数常用的方法整理

    希望对大家学习或者使用python3能具有一定的参考价值. __abs__     #返回一个数的绝对值 >>> num3=-22 >>> num3.__abs__ ...

  8. 什么是测试开发工程师-google的解释

    什么是测试开发工程师-google的解释 “ 软件测试开发工程师[SET or Software Engineer in Test],和软件开发工程师一样是开发工程师,主要负责软件的可测试性.他们参与 ...

  9. 在centOS7.2里安装virtualenv和flask

    1) 安装pip工具 #wget https://bootstrap.pypa.io/get-pip.py #python get-pip.py 2) 安装virtualenv,并创建一个开发环境 # ...

  10. 准备要开始写博客啦~Hello World

    Hello World 新的开始 加油咯 小蚊子~