Python算法竞赛:容斥原理+同余性质 核心用法一站式整理
在算法竞赛的计数取模类题目中经常会遇到「必须包含指定元素」「禁止某些元素」的约束——直接计算极易重复或遗漏而容斥原理是解决这类计数问题的核心工具面对超大数结果同余性质配合快速幂又能高效完成取模运算。本文结合蓝桥杯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 mm 防止出现负数乘法模(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 代码mod10**97# 无0的总数字串数totalpow(9,10000,mod)# 既不含3也不含7的数字串数no_3_no_7pow(7,10000,mod)# 容斥计算mod保证结果非负ans(total-2*pow(8,10000,mod)no_3_no_7mod)%modprint(ans)3.4 代码关键说明mod 10**97题目指定模数pow(9/8/7, 10000, mod)快速幂计算高次幂取模mod避免减法后出现负数确保结果合法最终% mod统一取模输出合规答案四、通用模板本题可提炼为通用计数模板适用于长度为 n 的数字串无0必须包含指定两个数字模板公式MOD10**97n长度 ans(pow(9,n,MOD)-2*pow(8,n,MOD)pow(7,n,MOD)MOD)%MOD五、总结容斥原理解决「必须包含」类计数用「总-禁1-禁2禁1∩禁2」快速去重避免枚举同余快速幂处理超大数幂运算与取模Python 内置 pow 最优两者结合搞定算法竞赛90% 计数取模高频题掌握这套组合拳同类题目直接套模板即可快速AC。