uva11645

此题要用大数啊。我一开始以为用longlong可以表示出来结果不行啊。。。哎。。

大致上可以这么想:

对于全1的情况比方说11111 那么可以将其分成4块(长度-1)

11***   x1

*11**   x2

**11*   x3

***11   x4

那么每一块就代表有两个1连续的情况。那么这样对于其他三个地方为任意值就可以不用管了所以用组合公式就可以了4*2^3

那么如果对于非全1的情况怎么统计呢:

比方说11100同样分成4块

11***   x1

*11**   x2

**11*   x3

***11   x4

然后呢我们对于x1先不考虑,同样因为其最高位为1而其后面的数不能大于100 所以当我们考虑x2x3x4时

我们假设最高位是0:则其他两位就可以任意取了2^2

我们假设最高位是1:则其统计的情况要小于100的最低位,那么我们又没有考虑第一种情况那么我们就相当于考虑其子状态1100这就是一个回溯的过程

然后由于我们没有统计第一个情况所以我们就当最高两位为11的时候统计比它大的数有多少那么从11000~11100的情况有多少种了,就是x1的统计啦。

由于我是用java写的大数应为其中乘法的实现会方便一点。我又不想用c++写大数乘法就略过了。。。

但是我在网上找了个c++的写法http://blog.csdn.net/sprithy_dream/article/details/8502884 可以借鉴下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值