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

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 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)

补充:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值