在算法竞赛的计数+取模类题目中,经常会遇到「必须包含指定元素」「禁止某些元素」的约束——直接计算极易重复或遗漏,而容斥原理是解决这类计数问题的核心工具;面对超大数结果,同余性质配合快速幂又能高效完成取模运算。本文结合蓝桥杯2024初赛真题,一站式梳理两大知识点的原理、用法与实战代码,看完就能直接套用。
一、:容斥原理(计数去重神器)
1.1 核心思想
容斥原理的本质是先算全集、再剔除非法、补回多减部分,通过「奇加偶减」消除重复计数,完美解决多约束下的合法计数问题。
1.2 二元容斥公式
针对「必须同时包含A、B」的场景,计算公式:
合法总数 = 全集 − 不含A的数量 − 不含B的数量 + 既不含A也不含B的数量
1.3 适用场景
- 必须包含指定数字/元素
- 同时排除多个禁止项
- 统计受限条件下的排列/组合数
二、:同余性质+快速幂(大数取模必备)
2.1 同余核心规则
算法竞赛中结果通常极大,必须对模数(如 10⁹+7)取余,关键规则:
- 加减模:
(a ± b) mod m = [(a mod m) ± (b mod m) + m] mod m(+m 防止出现负数) - 乘法模:
(a × b) mod m = [(a mod m) × (b mod m)] mod m - 幂模:
(a^b) mod m = pow(a, b, m)(Python 内置快速幂)
2.2 快速幂优势
Python 内置三参数pow(底数, 指数, 模数)可在O(log 指数)时间内算出高次幂的模,完美处理本题 10000 次幂这类超大指数运算。
三、真题实战:蓝桥杯P2225 数字串个数
3.1 题目回顾
构造长度为10000的数字串,满足:
- 不出现数字0
- 必须包含数字3 和 7
结果对10⁹+7取模。
3.2 容斥原理推导
- 全集:无0的数字串,每位可选1-9,共 9 种 → 总数为
9^10000 - 不含3:每位去掉3,剩8种 →
8^10000 - 不含7:每位去掉7,剩8种 →
8^10000 - 既不含3也不含7:去掉3、7,剩7种 →
7^10000
代入公式:
答案 = 9^10000 − 2×8^10000 + 7^10000(最后取模)
3.3 AC 代码
mod=10**9+7# 无0的总数字串数total=pow(9,10000,mod)# 既不含3也不含7的数字串数no_3_no_7=pow(7,10000,mod)# 容斥计算,+mod保证结果非负ans=(total-2*pow(8,10000,mod)+no_3_no_7+mod)%modprint(ans)3.4 代码关键说明
mod = 10**9+7:题目指定模数pow(9/8/7, 10000, mod):快速幂计算高次幂取模+mod:避免减法后出现负数,确保结果合法- 最终
% mod:统一取模,输出合规答案
四、通用模板
本题可提炼为通用计数模板,适用于:
长度为 n 的数字串,无0,必须包含指定两个数字
模板公式:
MOD=10**9+7n=长度 ans=(pow(9,n,MOD)-2*pow(8,n,MOD)+pow(7,n,MOD)+MOD)%MOD五、总结
- 容斥原理:解决「必须包含」类计数,用「总-禁1-禁2+禁1∩禁2」快速去重,避免枚举
- 同余+快速幂:处理超大数幂运算与取模,Python 内置 pow 最优
- 两者结合:搞定算法竞赛90% 计数+取模高频题
掌握这套组合拳,同类题目直接套模板即可快速AC。