poj 3252--Round Numbers

c(n,m) 表示从n个里取出m的组合数。

对于一个二进制数(b位)。其首位为1.则RN数
1.当b为偶数b=2k时, RN=c(2k-1,2k-1)+c(2k-1,2k-2)+...+c(2k-1,k+1);

由c(2k-1,0)=c(2k-1,2k-1);
  c(2k-1,1)=c(2k-1,2k-2);
  ...
  c(2k-1,k-1)=c(2k-1,k+1);

c(2k-1,0)+c(2k-1,1)+....+c(2k-1,k-1)+c(2k-1,k)+c(2k-1,k+1)+...+c(2k-1,2k-2)+c(2k-1,2k-1)=2^(2k-1);

即有RN+c(2k-1,k)+RN=2^(2k-1)

所以RN=[2^(2k-1)-c(2k-1,k)]/2;

即RN=[2^(b-1)-c(b-1,b/2)]/2;


2.当b为奇数b=2k+1时,RN=c(2k,2k)+c(2k,2k-1)+...+c(2k,k);

按1的思路,可得,RN=[2^(2k)]/2=[2^(b-1)]/2=2^(b-2);

--------------------------分割线----------------------------

问题归结于求<=n的RN(Round Numbers)个数。

1.把n转化为二进制,低位到高位->a[],位数为->index.
2.位数少于index的,即1,2,3 ,... ,index-1  用上面的方面解决。
3.位数为index的,遍历a[],用p,q记录遇到的0,1个数。
由i=(index-1)->0
遇到1(不是index-1)则处理,就是找出把当前的1变成0的所有RN数:由剩下的长度(即右边二进制位)为i。1的个数为q,0的个数为p+1(第i个位置是0的)。则RN数有,RN=c(i,i)+c(i,i-1)+..+c(i,k) ;  (!!!k的范围!!!!: k+p+1>=i-k+q && k>=0)

注:2,3的RN数之和就是n的RN数。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值