洛谷-P1590 失踪的7
废话不多说,直接思路+题解。。。
思路
具体思路是计算出每一个数对总方案数的贡献方法数,然后求和就好了。比如n=4321
:
1 的贡献值:很明显是1
,只能有1
这一种可能性。
2 的贡献值:注意在十位,所以贡献值应该是 $2∗9^1$
3 的贡献值:在百位,应该是 $3∗9^2$
4 的贡献值:在千位,应该是 $49^3$
所以某一个数的设位数为b
,值为a
贡献值就是 $a9^{b-1}$
然而,如何去证明呢?
很简单,因为7
不可用,每一位自然有9
个选择
那么根据乘法原理,一位数随机排列为9
种,两位数为81
种,n
位数就是 $9n9^n$9n 种,也就是 说,0-99999....9
就可以用乘法原理来算,如果去掉0
这种情况,再加上100000......0
这 种情况,一加一减抵消了,总数没有变。就变成了1-100000......0
的总数为 $a*9^b$种。
至此,我们就证明完了贡献值公式是正确的,但是,为什么总数是这些贡献值加起来呢?我们用位置原理 就能证明。还是之前那个例子,n=4321
,计算出了4
的贡献值,相当于我们已经算完了1......4000
了,剩下无论如何千位数也不会变,相当于剩下三位的玩耍,那就可以转化为三位数321
了。 计算完300
以内的,我们又可以同理再次转化,直到转化到末尾为止。因此,贡献值就是他们的和。
代码
1 |
|
未优化代码中
1 | long ans=0,k=1,minus=0; |
因为那个低级错误,浪费了我好长时间。
没加的话少了一个7的过滤。
贴上最简代码。
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 世界尽头のWasteland!
评论