zoukankan      html  css  js  c++  java
  • 扩欧(exgcd讲解)

    注意本文的证明都来源于这位大大大大大大大牛

    知识点.扩展欧几里得求逆元

    看完下面的证明后建议联系一下这题同余方程
    可以对exgcd的用途和写法有有初步了解。

    (问题描述:对于三个自然数 a,b,c ,求解 ax+by=c 的 (x,y) 的整数解)

    (先说一下贝祖定理: 两个整数 a、b 是互质的,等价于方程 ax+by=1有整数解。)

    (更一般的,对于任意的k有ax+by=gcd(a,b)*k)有整数解

    注意,接下来才是正题

    我们想求一组x,y使得

    [ax+by=gcd(a,b) ]

    (根据b!=0可得)

    [gcd(a,b)=gcd(b,a\%b) ]

    那就可以假设有(x'、y'满足)

    [bx'+(a\%b)y'=gcd(b,a\%b) ]

    (替换一下也就是)

    [ax+by=bx'+(a\%b)y' ]

    (注意到(frac{a}{b}向下取整))

    [a \% b=a-(frac{a}{b})b ]

    (替换进去得到)

    [ax+by=bx'+(a-(frac{a}{b})b)y' ]

    (既然左边有a,b。那我们也对右边提取a,b)

    [ax+by=ay'+b(x'-frac{a}{b}y') ]

    聪明的你一定发现了这个东西是个递归的式子,那么我们肯定要找到那组base case(也就是递归基).

    (这样递归下去,当b=0时要满足ax+by=gcd(a,b).即为x=1,y=0)

    void exgcd(ll a,ll b,ll &x,ll &y)
    {
    	if(!b)	x=1,y=0;
    	else	exgcd(b,a%b,y,x),y-=a/b*x;
    }
    

    (算i对p的逆元时)

    (exgcd(i,p,x,y)算出的x就是逆元了。)

  • 相关阅读:
    P3368 【模板】树状数组 2
    P3374 【模板】树状数组 1
    P1631 序列合并
    P1387 最大正方形
    P1197 [JSOI2008]星球大战
    P2866 [USACO06NOV]糟糕的一天Bad Hair Day
    P1196 [NOI2002]银河英雄传说
    SP1805 HISTOGRA
    P1334 瑞瑞的木板
    2019信息学夏令营游记
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12662007.html
Copyright © 2011-2022 走看看