uva11038

此题是排列组合的好题啊! 这两天头痛的厉害。。。加上生物钟紊乱 人整个就是个虚的。。。都没什么脑筋做题了。。。。

如果这次题解描述又问题请留言。。。一来我是时间紊乱睡不着又想睡觉的这个时间下写的。想到什么写什么的。所以表述就没有那么清晰了

此题可以这么考虑:


对于第i位的数字 为x

那么如果当前数字不为0 的话

我们可以这么想当前数字的左边的数字的大小是left,可以可以是从0到左边数字的一个组合就有left个数字,那么右边的数字组合就可以任意组合从0-9每位共10个组合,所以就是10^i个情况 两者相乘就可以了。 为什么呢? 假设数字为12345,那么我个位上为0的个数是否就有1234个呢。就是左边任选一个 右边仅为0.那么如果是第二位的情况呢。由于第一次已经求出了各位为0的情况为了组合不重复所以我在算的时候就不用算右边的数字组合情况了。就是说第二位为0的情况就有123*10^1个情况。

如果当前数字不为0的话

那么就是左边的数字组合情况就要-1了因为要-1去其本身(例如12345的例子中第一位的情况1234种情况最后一种出现0的情况是12340)而如果当前位为0那么这种情况就多算了一次所以要减去1次 在*右边的组合数(10^i) 然后由于左边的最大一种情况去掉了,那么我们就要人工加上右边的数字(例如12304,当我们枚举到1230的时候右边有4种情况,这是人工枚举的)

那么这样就可以得到0——x之间的数0情况,那么我们只要用f(n)-f(m-1)就可以了。

简化的思想就是:

x的第i位数出现0的情况(当前位不是0) =x左边的数(高位)*10^k

x的第i位数出现0的情况(当前位是0)     =(x左边的数-1)*10^k+(x右边的数+1)

算总和。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值