文章目录
- 习题
- 质数
- 找素数
- 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数,质因数,最大公约数,最小公倍数等等
素数
- 首先介绍这个素数的问题,也就是质数,只能被
1或者本身整除
,最小的素数是2 - 需要掌握
埃氏筛或者欧拉筛
求解出1-n
的范围内的所有的质数
is_prime = [True]*(N+1)
prime = []
for i in range(2,N+1):if is_prime[i]:prime.append(i)for j in range(2*i,N+1,i):is_prime[j] = False
# 最后的话,这个prime 会存储所有的质数
求解一个数的质因数
求解最小质因数
- 同样,也可以使用
埃氏筛,也可以使用欧式筛
def minprime(n):i = 2while i*i <= n:if n % i == 0:return ii += 1# 质数最后会返回自己本身return n
求解一个数的全部的质因数组成
def zuprime(n):ans = []i = 2while i*i <=n:while n % i == 0:ans.append(i)n = n // ii += 1if n > 1:ans.append(n)return ans
求解一个范围内的数的最小质因数
使用欧式筛
,欧式筛的原理就是,每一个数只会被最小质因数所筛选,所以相对于埃氏筛来说具有优势
# 在这里我们初始化全部的数的最小质因数都是1,也包括质数
minprime = [1]*(N+1)
is_prime = [True]*(N+1)
prime = []
for i in range(2,N+1):if is_prime[i]:prime.append(i)for j in prime:if i*j > N :breakis_prime[i*j] = Falsemin_prime[i*j] = j# 保证只能被最小质因数筛选if i % j == 0:break
最大公因数
a和b
的最大公因数表示,可以整除a,b
的最大的公因数,一般使用辗转相除法
进行求解
import math
# 需要求解a,b的最大公因数,可以直接调用这个gcd函数进行求解
ans = math.gcd(a,b)
最小公倍数
a和b
的最小公倍数LCM
可以通过这个与最大公因数的关系进行求解
# lcm(a,b) = a*b // math.gcd(a,b)
组合数
快速幂
- 可以使用
pow
方法求解取模的幂次,类似于快速幂
result = pow(base, exponent, mod) # 计算 (base ** exponent) % mod# 也可以手动实现上述功能
def quick_pow(a, n):ans = 1while n > 0:if n & 1: # 如果该二进制位存在ans = ans * a % MODa = a * a % MODn >>= 1 # n除以2,判断下一个二进制位return ans
容斥定理
错位排序
习题
质数
找素数
- 由于是填空题,直接暴力求解
N = 10**7
prime = []
is_prime = [True]*(N+1)
for i in range(2,N+1):if is_prime[i]:prime.append(i)for j in range(i*2,N+1,i):is_prime[j] = False
if len(prime) > 10**5 +2 :print(prime[10**5+1])
# 1299743