2022-02-11 每日打卡:难题精刷
写在前面
“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,所刷题目共三个来源:之前没做出来的 ;Leetcode中等,困难难度题目; 周赛题目;某个专题的经典题目,所有代码已AC。每日1-3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。
越狱
比较简单,就是背一下快速幂的做法。
mod = 100003
m, n = [int(i) for i in input().split(" ")]
ans = pow(m,n,mod)- m*pow(m-1,n-1,mod)
print(ans%mod)
源码如下:
def pow_mod(x, y, z):
"Calculate (x ** y) % z efficiently."
number = 1
while y:
if y & 1:
number = number * x % z
y >>= 1
x = x * x % z
return number
同余线索
这里有几个概念:
- 逆元:逆元是模运算中的一个概念,我们通常说 a是 【b 模 c】 的逆元,实际上是指 a * b = 1 mod c
- 扩展欧几里得方法:将 a ∗ b = 1 m o d c a*b = 1 \mod c a∗b=1modc 转化为 a ∗ b − c ∗ 某 个 整 数 = 1 a*b - c*某个整数 = 1 a∗b−c∗某个整数=1。此时通过求exgcd(b, c)—>使用欧几里得算法不断递归直到x=1,y=0 —> 反向递归求出第一层的x和y,x即为e模m的逆元。
from math import *
def exgcd(a, b):
if(b == 0):
return 1,0
# x是返回的y,y是y-x*(a//b)
y, x = exgcd(b, a%b)
y = y - x * (a // b)
return x, y
a, b = map(int, input().split(' '))
x, y = exgcd(a, b)
x = (x + b) % b
print(x)
补充: