• 扩展欧几里得


    扩展欧几里得算法

    a x + b y = g ax+by=g ax+by=g 的一组解,其中 g = gcd ⁡ ( a , b ) g = \gcd(a,b) g=gcd(a,b)

    辗转相除递归求解。

    假设已经求出 b x + ( a   m o d   b ) y = d bx + (a \bmod b)y = d bx+(amodb)y=d 的一组解。

    a x + b y = b x ′ + ( a   m o d   b ) y ′ = b x ′ + ( a − b × ⌊ a b ⌋ ) y ′ = a y ′ + b ( x ′ − ⌊ a b ⌋ y ′ ) ax+by=bx'+(a\bmod b)y'\\ =bx'+(a-b \times \lfloor\frac{a}{b} \rfloor)y'\\ =ay'+b(x'- \lfloor\frac{a}{b}\rfloor y') ax+by=bx+(amodb)y=bx+(ab×ba⌋)y=ay+b(xbay)

    x = y ′ , y = x ′ − ⌊ a b ⌋ y ′ x = y', y = x' - \lfloor\frac{a}{b} \rfloor y' x=y,y=xbay。递归计算即可。 b = 0 b = 0 b=0 时,由辗转相除得 a = g a = g a=g,则 x = 1 , y = 0 x=1,y=0 x=1,y=0 显然是一组解。

    void exgcd(int a, int b, int &x, int &y)
    {
    	if(b == 0) return x = 1, y = 0, void();
    	exgcd(b, a%b, y, x), y -= (a / b) * x;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    扩欧求逆元

    a a a 在模 p p p 下得逆元,等价于求 a x ≡ 1 ( m o d p ) ax \equiv 1 \pmod p ax1(modp),等价于 a x + p y = 1 ax +py = 1 ax+py=1 gcd ⁡ ( a , p ) = 1 \gcd(a,p)=1 gcd(a,p)=1 时才有解,即 a a a 有逆元。

    裴属定理

    我们对问题加以扩展,求解 a x + b y = c ax + by = c ax+by=c

    裴属定理:方程有解当且仅当 gcd ⁡ ( a , b ) ∣ c \gcd(a,b) \mid c gcd(a,b)c

    若方程有解,则用扩欧求出 a x + b y = g ax + by = g ax+by=g 对一组特解后乘以 c g \frac c g gc 即可(由裴属定理得 c g \frac c g gc 为整数)。

    再找出特解后,加上 a x + b y = 0 ax+by=0 ax+by=0 的解即可得到该不定方程的通解。

    { x = x 0 + b g t y = y 0 − a g t ( t ∈ Z ) {x=x0+bgty=y0agt \\(t\in \mathbb{Z}) {x=x0+gbty=y0gat(tZ)

    例题

    iai 两个闹钟

    不妨令 m > n m > n m>n

    首先有 n + a x = m + b y n + ax=m + by n+ax=m+by

    等价于 a x + b y = m − n ax+by=m-n ax+by=mn x ≥ 0 , y ≤ 0 x\ge 0,y \le 0 x0,y0

    裴属定理判断有无解。

    m > n m>n m>n y ≤ 0 y \le 0 y0 x x x 一定 ≥ 0 \ge 0 0,而 x ≥ 0 x \ge 0 x0 y y y 不一定 ≤ 0 \le 0 0

    故扩欧找出一组特解后,利用零解找一组 y ≤ 0 y \le 0 y0 的解。又由题, y y y 应为最小负数。代码

    青蛙的约会

    n + a x ≡ m + b x ( m o d P ) n+ax \equiv m + bx \pmod P n+axm+bx(modP)

    ( a − b ) x ≡ m − n ( m o d P ) (a-b)x \equiv m-n \pmod P (ab)xmn(modP)

    采用逆元 / 改写二元不定方程的方式,两者本质相同。

  • 相关阅读:
    二维费用背包问题的解题套路
    Win7安装nvme协议的SSD硬盘方法
    一个基于NetCore模块化、多租户CMS系统
    13个 Python 必备的知识,建议收藏
    UE4 局域网联机案例
    java基于Springboot+vue的超市购物商城网站 elementui
    electron初学
    高并发和大数据下的高级算法与数据结构:如何快速获取给定年龄区间的微信用户数量或快速获取美团中购买量前k的品类
    Tableau文件管理
    WINDOWS在电脑中起什么样的作用
  • 原文地址:https://blog.csdn.net/weixin_73113801/article/details/133325064