POJ 3252 Round Numbers
来源:互联网 发布:单片机正弦波 编辑:程序博客网 时间:2024/05/19 20:56
题意:求区间[start, finish]里Round Number的个数(二进制中0的个数大于等于1的个数的数称为Round Number).
思路:记f(start, finish)为[start, finish]里Round Number的个数,那么要求f(start,finish),只需用f(0,finish)-f(0,start-1)即可,则问题转化为给定x,求出f(0,x).
假定x=(10101101),其长度为8位.而[0,x]中的数可分为二进制长度小于8位的和二进制长度等于8位的.
首先看二进制长度小于8位的,即求出长度在[0,7]区间内的Round Number个数.对于长度为len的二进制(最高位一定是1),记其Round Number个数为R(len),可按照len的奇偶性分两种情况.
1. len=2k+1时,去掉最高位的1,剩下2k位里至少要有k+1个0,用C(n,m)表示n个位置选m个位置的方法.
有R(len)=C(2k,k+1)+C(2k,k+2)+…+C(2k,2k)=1/2*(2^(2k)-C(2k,k))
2. 同理可得,len=2k时,R(len)=1/2*(2^(2k-1))
接下来看二进制长度为8位的.
首先判断x本身,然后对于x的二进制,若将其中除了最高位的1以外的任意一个或多个1变为0,得到的数一定小于x,那么就能通过这种方法得到二进制位数和x相等且比x小的Round Number个数了.
最后将两部分结果求和即可.
精度方面,2000000000<2*1024*1024*1024=2^31,故用31位表示数组,又第一位总为1,所以组合数只用求到30,C(30,k) (0<=k<=30) <= 2^30,故用int即可.
/*
* algorithm : math
*
* Memory 392K Time 0MS Language G++
*
* code by : zhyu
*/
#include <cstdio>
const
int
N = 31;
int
c[N][N],pow2[N];
bool
bin[N];
inline
void
init(
void
)
{
for
(
int
i=0;i<N;i++) c[i][0]=c[i][i]=1,pow2[i]=(1<<i);
for
(
int
i=2;i<N;i++)
for
(
int
j=1;j<i;j++)
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
int
gao(
int
x)
{
if
(x<=1)
return
0;
int
i,j,k,n1,n0,len,res=0;
for
(i=0;i<N;i++) bin[i]=((pow2[i]&x)!=0);
for
(i=N-1;i>=0 && bin[i]==0;i--);
for
(len=i;len>=1;len--)
if
(len&1) res+=((pow2[len-1]-c[len-1][(len-1)/2])>>1);
else
res+=(pow2[len-1]>>1);
for
(j=i,n0=n1=0;j>=0;j--)
if
(bin[j]) n1++;
else
n0++;
if
(n1<=n0) res++;
for
(j=i-1,n0=0,n1=1;j>=0;j--)
if
(bin[j])
{
for
(k=j;k>=0 && k+n0+1>=j-k+n1;k--) res+=c[j][k];
n1++;
}
else
n0++;
return
res;
}
int
main(
void
)
{
init();
int
st,ed;
scanf
(
"%d%d"
,&st,&ed);
printf
(
"%d\n"
,gao(ed)-gao(st-1));
return
0;
}
- poj 3252--Round Numbers
- poj 3252 Round Numbers
- poj 3252 Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- poj 3252 Round Numbers
- poj-3252-Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- POJ 3252 Round Numbers
- poj 3252 Round Numbers
- poj 3252 Round Numbers
- POJ 3252 Round Numbers
- html中字体,特殊字符和标签如何显示呢?
- SQL Server数据类型
- Android Widget 简单例程(mp3播放)
- 云计算简单知识整理
- 合并两个有序单链表
- POJ 3252 Round Numbers
- OEM,ODM,OBM是什么??
- web中的checkbox以及strtus2的CheckboxInterceptor
- 值得参考的 10 个 LESS CSS 实例
- 原创伤感qq日志-早已习惯两指之间夹着烟的孤单
- 媒体MediaPlayer错误详细解析
- CoUninitialize 退出时 m_pInterface->Release()崩溃 解决
- IOS-沙盒机制和用户文件操作
- 数字雨程序源码