第十五届蓝桥杯 Python B 组省赛(第二题解析)
[问题描述]
小蓝想要构造出一个长度为10000的数字字符串,有以下要求:
1.小蓝不喜欢数字0,所以数字字符串中不可以出现0;
2.小蓝喜欢数字3和 7,所以数字字符串中必须要有3和 7 这两个数字。
请问满足题意的数字字符串有多少个?这个数字会很大,你只需要输出其 对
1
0
9
+
7
10^9+7
109+7取余后的结果。
[答案提交]
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写
多余的内容将无法得分。
[解题思路]
分析过程如下:
(1)首先,我们明确问题的约束条件
- 数字字符串的长度为10000。
- 字符串中不能包含数字0。
- 字符串中必须包含数字3和7。
- 接下来,我们考虑如何计算满足这些条件的字符串数量:
(2)全集大小:由于每个位置都可以从1到9这9个数字中选一个,所以全集的大小(即所有可能的数字字符串的数量)是
9
10000
9^{10000}
910000 。
(3)不满足条件的集合:
- 不包含数字3的字符串数量是 8 10000 8^{10000} 810000。(因为每个位置都可以从1, 2, 4, 5, 6, 7, 8, 9这8个数字中选一个)。
- 不包含数字7的字符串数量也是 8 10000 8^{10000} 810000(同理)。
- 但是,我们需要注意,当我们从全集中减去不包含数字3的字符串和不包含数字7的字符串时,我们多减去了那些同时不包含数字3和数字7的字符串。因此,我们需要将它们加回来。
- 同时不满足条件的集合:同时不包含数字3和数字7的字符串数量是
8
10000
8^{10000}
810000。
(因为每个位置都可以从1, 2, 4, 5, 6, 8, 9这7个数字中选一个)。
应用容斥原理:根据容斥原理,满足条件的字符串数量是全集大小减去不满足条件的集合大小,再加上多减去的部分。即:
N = 9 10000 − 2 × 8 10000 + 7 10000 N=9^{10000}−2×8^{10000} +7^{10000} N=910000−2×810000+710000
(4)取模运算:由于结果可能非常大,我们需要对
1
0
9
+
7
10^9 +7
109+7取余,以避免整数溢出。
(5)最后,我们可以使用快速幂算法来计算大数的幂并取模,以得到最终的结果。而Python的pow(a,x,mod)
就是一个类似于快速幂算法的函数,我们可以直接用来求快速幂取模。
[题解]
mod = 10**9 + 7
p9 = pow(9, 10000, mod)
p8 = pow(8, 10000, mod)
p7 = pow(7, 10000, mod)
print((p9 - 2 * p8 + p7) % mod)
# 157509472
如果您觉得对您有帮助,就请给我点个赞吧!Thanks♪(・ω・)ノ