POJ3252-Round Numbers 数学
题目链接: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 数学的更多相关文章
- [BZOJ1662][POJ3252]Round Numbers
[POJ3252]Round Numbers 试题描述 The cows, as you know, have no fingers or thumbs and thus are unable to ...
- POJ 3252 Round Numbers 数学题解
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- poj3252 Round Numbers
Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7625 Accepted: 2625 Des ...
- POJ3252 Round Numbers —— 数位DP
题目链接:http://poj.org/problem?id=3252 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Su ...
- poj3252 Round Numbers(数位dp)
题目传送门 Round Numbers Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16439 Accepted: 6 ...
- poj3252 Round Numbers (数位dp)
Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...
- POJ3252 Round Numbers(不重复全排列)
题目问区间有多少个数字的二进制0的个数大于等于1的个数. 用数学方法求出0到n区间的合法个数,然后用类似数位DP的统计思想. 我大概是这么求的,确定前缀的0和1,然后后面就是若干个0和若干个1的不重复 ...
- POJ3252 Round Numbers 【数位dp】
题目链接 POJ3252 题解 为什么每次写出数位dp都如此兴奋? 因为数位dp太苟了 因为我太弱了 设\(f[i][0|1][cnt1][cnt0]\)表示到二进制第\(i\)位,之前是否达到上界, ...
- poj3252 Round Numbers[数位DP]
地址 拆成2进制位做dp记搜就行了,带一下前导0,将0和1的个数带到状态里面,每种0和1的个数讨论一下,累加即可. WA记录:line29. #include<iostream> #inc ...
- POJ3252 Round Numbers 题解 数位DP
题目大意: 求区间 \([x,y]\) 范围内有多少数的二进制表示中的'0'的个数 \(\ge\) '1'的个数. 解题思路: 使用 数位DP 解决这个问题. 我们设状态 f[pos][num0][n ...
随机推荐
- ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application
今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...
- 【已解决】Windows下 MySQL大小写敏感 解决方案及分析
Windows下 MySQL大小写敏感配置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-3-27 最近在window ...
- Oracle SQL 语言分类
Oracle SQL语句分类 2008-06-17 11:15:25 分类: Linux * 2008/06/17 星期二*蒙昭良*环境:WindowsXP + Oracle10gR2*Oracl ...
- [LeetCode] Zuma Game 题解
题目 题目 Think about Zuma Game. You have a row of balls on the table, colored red(R), yellow(Y), blue(B ...
- [SinGuLaRiTy] COCI 2011~2012 #2
[SinGuLaRiTy-1008] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 测试题目 对于所有的题目:Time Limit:1s ...
- 玩转 SSH(六):SpringMVC + MyBatis 架构搭建(注解版)
一.创建 SSMVCAnnoDemo 项目 点击菜单,选择“File -> New Project” 创建新项目.选择使用 archetype 中的 maven-webapp 模版创建. 输入对 ...
- android 开机自启动实现
App的开机自启动可以通过注册广播接收器接收开机广播来实现,具体步骤如下: 1.创建 BroadcastReceiver 的派生类,并重写 onReceive() 函数: /** * Created ...
- 使用express创建新应用的骨架
通过应用生成器工具 express 可以快速创建一个应用的骨架. 通过如下命令安装: $ npm install express-generator -g -h 选项可以列出所有可用的命令行选项: $ ...
- Activity的Task详解
1.Task Task是一个具有栈结构(后进先出)的容器,可以放置多个Activity实例.启动一个应用,系统就会为之创建一个Task,来放置根Activity.默认情况下,一个Activity启动另 ...
- Windows安装mysql-python提示:error: Microsoft Visual C++ 9.0 is required
Windows安装mysql-python提示:error: Microsoft Visual C++ 9.0 is required,Get it from http://aka.ms/vcpyth ...