2022-02-11 每日打卡:难题精刷

2022-02-11 每日打卡:难题精刷

写在前面

“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,所刷题目共三个来源:之前没做出来的 ;Leetcode中等,困难难度题目; 周赛题目;某个专题的经典题目,所有代码已AC。每日1-3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。

越狱

2022-02-11 每日打卡:难题精刷_第1张图片

比较简单,就是背一下快速幂的做法。

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

同余线索

2022-02-11 每日打卡:难题精刷_第2张图片
这里有几个概念:

  • 逆元:逆元是模运算中的一个概念,我们通常说 a是 【b 模 c】 的逆元,实际上是指 a * b = 1 mod c
  • 扩展欧几里得方法:将 a ∗ b = 1 m o d    c a*b = 1 \mod c ab=1modc 转化为 a ∗ b − c ∗ 某 个 整 数 = 1 a*b - c*某个整数 = 1 abc=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)

补充:

  • 扩展欧几里得算法求逆元的证明:
    2022-02-11 每日打卡:难题精刷_第3张图片
  • 现实中往往被应用至RSA加密算法

你可能感兴趣的:(algorithm,leetcode,算法,职场和发展)