文章目录
- P1226 【模板】快速幂
- 题目分析
- 代码
- P3367 【模板】并查集
- 题目分析
- 代码
- P3378 【模板】堆
- 题目分析
- 代码
- P3383 【模板】线性筛素数
- 题目分析
- 代码
- P3366 【模板】最小生成树
- 题目分析
- 代码
- P3390 【模板】矩阵快速幂
- 题目分析
- 代码
- 【模板】单源最短路径
- 题目分析
- 代码
P1226 【模板】快速幂
题目地址:【模板】快速幂
题目分析
快速幂原理:
以这个为例 a = 2 , b = ( 11 ) 10 = ( 1011 ) 2 a=2,b=(11)_{10}=(1011)_{2} a=2,b=(11)10=(1011)2,求 2 11 。 2^{11}。 211。
2 11 = 2 8 × 2 0 × 2 2 × 2 1 2^{11}=2^{8} \times 2^{0} \times 2^{2} \times 2^{1} 211=28×20×22×21,幂的次数正好对应 ( 1011 ) 2 (1011)_{2} (1011)2
那么只需循环判断即可。
“”“
ans = 1
base = a = 2^1第一次循环
b = 12 = '0b1011' # 0b是python里的二进制标志
1 = '0b0001'
b & 1 = '0b0001' = 1
ans = ans * base = 1 * 2 = 2
base = 2^2
b = b >> 1 = '0b101'第二次循环
b & 1 = '0b001' = 1
ans = 2 * 2^2 = 2^3
base = 2^4
b = b >> 1 = '0b10'第三次循环
b & 1 = '0b00' = 0
base = 2^8
b = b >> 1 = '0b1'第四次循环
b & 1 = '0b1' = 1
ans = 2^3 * 2^8 = 2^11
base = 2^16
b = b >> 1 = 0 # b=0 退出循环最后的ans = 2^11.
计算次数由O(b) => log(b)
”“”
通常对于快速幂一般结合取余(mod)来考。了解原理即可
( A + B ) m o d P = ( A m o d P + B m o d P ) m o d P (A+B) \, mod \, P = (A \, mod \, P + B \, mod \,P)\,mod\,P (A+B)modP=(AmodP+BmodP)modP
( A × B ) m o d P = ( ( A m o d P ) × ( B m o d P ) ) m o d P (A \times B)\,mod\,P=((A\,mod\,P) \times (B\,mod\,P))\,mod\,P (A×B)modP=((AmodP)×(BmodP))modP
见代码。
代码
# 快速幂
def quickpower(a: int, b: int):base = aans = 1while b > 0:if b & 1:ans *= basebase *= baseb = b >> 1return ans# 快速幂应用--取余
def quickmod(a: int, b: int):base = aans = 1while b > 0:if b & 1:ans *= baseans %= pbase *= basebase %= pb = b >> 1return ansa, b, p = map(int, input().split())
# 只能过一半百分之五十
# ans = quickpower(a, b) % p
# print(f"{a}^{b} mod {p}={ans}")
# AC
ans = quickmod(a, b)
print(f"{a}^{b} mod {p}={ans}")
P3367 【模板】并查集
题目地址:【模板】并查集
题目分析
这个找并集就是找他们共同的祖先。就以题目例题来看.
"""
n = 4, m = 7
fa = [0, 1, 2, 3, 4]① 1、2的祖先分别为1、2 不相等,输出N
② 将1、2合并,设2为1的祖先,fa = [0, 2, 2, 3, 4]
③ 1、2的祖先分别为2、2 相等,输出Y
④ 将3、4合并,设4为3的祖先,fa = [0, 2, 2, 4, 4]
⑤ 1、4的祖先分别为2、4 不相等,输出N
⑥ 将2、3合并,设3是2的祖先,fa = [0, 2, 3, 4, 4]
⑦ 1的爸爸是2,2的爸爸是3,3的爸爸是4 => 1的祖先是44的祖先是4相等输出Y
"""
这个找祖先的函数递归一下就可以了。
见代码
代码
# 递归找爹
def find(x):if x == fa[x]:return xfa[x] = find(fa[x])return fa[x]n, m = map(int, input().split())
fa = [i for i in range(n+1)] # 初始化自己为爹
for _ in range(m):z, x, y = map(int, input().split())a, b = find(x), find(y)if z == 1:fa[a] = belse: # z == 2if a == b:print('Y')else:print('N')
P3378 【模板】堆
题目地址:【模板】堆
题目分析
代码
P3383 【模板】线性筛素数
题目地址:【模板】线性筛素数
题目分析
代码
P3366 【模板】最小生成树
题目地址:【模板】最小生成树
题目分析
代码
P3390 【模板】矩阵快速幂
题目地址:【模板】矩阵快速幂
题目分析
代码
【模板】单源最短路径
见【模板】单源最短路径
题目分析
见【模板】单源最短路径
代码
见【模板】单源最短路径