蓝桥杯 之 数论
文章目录
- 习题
- 质数
- 找素数
- 数论,就是一些数学问题,蓝桥杯十分喜欢考察,常见的数论的问题有:取模,同余,大整数分解,素数,质因数,最大公约数,最小公倍数等等
素数
- 首先介绍这个素数的问题,也就是质数,只能被
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 = 2
while i*i <= n:
if n % i == 0:
return i
i += 1
# 质数最后会返回自己本身
return n
求解一个数的全部的质因数组成
def zuprime(n):
ans = []
i = 2
while i*i <=n:
while n % i == 0:
ans.append(i)
n = n // i
i += 1
if 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 :
break
is_prime[i*j] = False
min_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 = 1
while n > 0:
if n & 1: # 如果该二进制位存在
ans = ans * a % MOD
a = a * a % MOD
n >>= 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