1. 程式人生 > 實用技巧 >題解 UVA10104 【Euclid Problem】

題解 UVA10104 【Euclid Problem】

\(\text{exgcd}\) 模板題

首先,我們需要知道 \(\text{B}\acute{e}\text{zout}\) 定理:對於任意整數 \(a,b\),存在一對整數 \(x,y\),滿足 \(ax+by=\gcd(a,b)\)

證明(部分摘自藍書):

在歐幾里得演算法(輾轉相除法)的最後一步,即 \(b=0\) 時,顯然有 \(x=1,y=0\),使得 \(a\times1+b\times0=\gcd(a,0)\)

\(b>0\),則 \(\gcd(a,b)=\gcd(b,a\bmod b)\)。假設存在一對整數 \(x,y\),滿足 \(bx+(a\bmod b)y=\gcd(b,a\bmod b)\)

,因為

\[bx+(a\bmod b)y=bx+(a-b\lfloor\dfrac{a}{b}\rfloor)y=ay-b(x-\lfloor\dfrac{a}{b}\rfloor y) \]

所以令 \(x'=y,y'=x-\lfloor\dfrac{a}{b}\rfloor y\),就得到了 \(ax'+by'=\gcd(a,b)\)

在歐幾里得演算法的遞迴中應用數學歸納法,可知 \(\text{B}\acute{e}\text{zout}\) 定理成立。

\(\huge{證畢}\)

由此可得到程式碼:

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

對於每個詢問,由求出的 \(x,y\) 得出一組解即可,如 x y ax+by