本期博客是蓝桥杯备赛中算术(数学问题)的第二期,包括:快速幂算法、逆元(模意义下的倒数)、组合数计算和排列数计算。
每一种数学问题都在给出定义的同时,给出了其求解方法的示例代码,以供低年级师弟师妹们学习和练习。
前序知识:
(1)Python基础语法
1. 定义:
快速计算大指数幂的算法。
2. 算法原理:
3. 优缺点:
4. 用途:
大数模运算。
5. 示例代码:
# 快速幂算法
def fast_power(base, power):
result = 1
while power > 0:
# 当指数为奇数时,乘一次基数
if power % 2 == 1:
result *= base
# 基数平方
base *= base
# 指数折半(整数除法)
power = power // 2
return result
print(fast_power(3, 13)) # 输出:1594323
# 在竞赛中,可以使用python内置的快速幂函数pow
print(pow(3, 13)) # 输出:1594323
1. 定义:
a MOD − 2 m o d MOD a^{\text{MOD}-2} \mod \text{MOD} aMOD−2modMOD 就是 a a a 对 M O D MOD MOD 的逆元。
2. 算法原理——费马小定理:
3. 优缺点:
4. 用途:
组合数模运算。
5. 示例代码:
# 逆元
MOD = 10**9+7 # 常用质数模数
def mod_inverse(a, mode):
# 使用Python内置快速幂函数
return pow(a, MOD-2, MOD)
print(mod_inverse(7, MOD)) # 输出:142857144(因为7*142857144 ≡1 mod 1e9+7)
1. 定义:
从n个元素中选k个的组合方式数。
2. 算法原理:
C ( n , k ) = C ( n − 1 , k − 1 ) + C ( n − 1 , k ) C(n,k) = C(n-1,k-1) + C(n-1,k) C(n,k)=C(n−1,k−1)+C(n−1,k)
C ( n , k ) = n ! k ! ( n − k ) ! C(n,k) = \frac{n!}{k!(n-k)!} C(n,k)=k!(n−k)!n!
3. 优缺点:
4. 用途:
概率统计、排列组合问题。
5. 示例代码:
# 组合数计算
def combination(n, k):
if k < 0 or k > n:
return 0
# 利用组合数的对称性减少计算量
k = min(k, n - k)
result = 1
# 计算公式的乘积形式
for i in range(1, k+1):
# 分子:n - k + i
# 分母:i
result = result * (n - k + i) // i # 注意整除顺序
return result
print(combination(10, 3)) # 输出:120
# 在竞赛中,可以使用Python内置的组合数函数comb
from math import comb
print(comb(10, 3)) # 输出:120
1. 定义:
从n个不同元素中取出k个元素进行排列的不同方式数。
2. 算法原理:
P ( n , k ) = n × ( n − 1 ) × ⋯ × ( n − k + 1 ) = n ! ( n − k ) ! P(n,k) = n \times (n-1) \times \dots \times (n-k+1) = \frac{n!}{(n-k)!} P(n,k)=n×(n−1)×⋯×(n−k+1)=(n−k)!n!
3. 优缺点:
4. 用途:
排列组合、概率计算、排序问题。
5. 示例代码:
# 排列数计算
def permutation(n, k):
# 处理非法输入情况
if k < 0:
return 0
if k == 0:
return 1 # 空排列视为一种情况
if k > n:
return 0
result = 1
# 从n开始连乘k次(即n*(n-1)*...*(n-k+1))
for i in range(n, n - k, -1):
result *= i
return result
# 验证示例
print(permutation(5, 2)) # 输出:20(5*4)
# 在竞赛中,可以使用Python内置的排列数函数permutations
from itertools import permutations
print(len(list(permutations('abcde', 2)))) # 输出:6('ab', 'ac', 'ba', 'bc', 'ca', 'cb')