题目链接: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. Jmeter-线程组

    1.Sampler 取样器(Sampler)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler , 如 HTTP Request Sam ...

  2. .net core 持续构建简易教程

    环境需求:jenkins和.netcore 由于jenkins在真机上的部署比较麻烦,所以在这里我使用基于jenkins的Docker,只要任何一台运行docker的环境都可以进行以下的操作. doc ...

  3. React+ES6+Webpack环境配置

    转自http://www.cnblogs.com/chenziyu-blog/p/5675086.html 参考http://www.tuicool.com/articles/BrAVv2y Reac ...

  4. Angular--学习

    18:28:34 Angular简介 AngularJS通过指令 扩展了HTML,并通过 表达式 绑定数据到HTML Angular扩展了HTML AngularJS 通过 ng-directives ...

  5. Android报错:WindowManager$BadTokenException: Unable to add window -- window has already been added

    很久之前测试通过的代码,现在手机升级了Android7.0后一运行就崩溃,报出这样的错误,具体错误如下: Process: com.example.sho.android_anti_theft, PI ...

  6. js 形参和实参---2017-04-11

    一.定义 1.实参(argument):     全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量.变量.表达式.函数等, 无论实参是何种类型的量,在进行函数调用时, ...

  7. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  8. ios sqlite3的简单使用

    第一:创建表格 //创建表格 -(void)creatTab{ NSString*creatSQL=@"CREATE TABLE IF NOT EXISTS PERSIONFO(ID INT ...

  9. 使用 Http 的 Post 方式与网络交互通信

    package zw1; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStream; ...

  10. apache-maven-3.3.9 环境配置

    本地 maven 环境 安装 Maven 之前要求先确定你的 JDK 已经安装配置完成.Maven是 Apache 下的一个项目,目前我的新版本是 3.3.9. 1.官网下载 Maven:http:/ ...