扩展欧几里得
今天弄了个扩欧。还好吧(也许并未深入理解。。。)
前置知识:裴蜀定理。
ax+by=gcd(a,b) 必定存在x,y的整数解。(证明也没必要,能感性理解的吧)
应用:已知a, b,求解一组x,y,使它们满足等式: ax+by =gcd(a, b)
下面:
设 a>b,那么当 b=0 时, gcd(a,b)=a, ax=a,则 x=1,y=0
设 ax1+by1=gcd(a,b) , bx2+(a%b)y2=gcd(a,b) 因为 gcd(a,b)==gcd(b,a%b) , 所以 ax1+by1=bx2+(a-a/b*b)y2 --> ax1+by1=bx2+ay2-a/b*b*y2
根据多项式恒等定理(两边的a,b一样):
x1=y2 , y1=x2-a/b*y2 (这两句话很重要,求解的核心!!!)
这样我们可以通过不断递归,直到 b=1, 求出解后返回来。
奇妙啊!
上代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a,b,x,y; 4 inline int exgcd(int a,int b,int &x,int &y) 5 { 6 if (b==0) 7 { 8 x=1,y=0; 9 return a; 10 } 11 int gcd=exgcd(b,a%b,x,y); 12 int x1=x,y1=y; 13 x=y1; 14 y=x1-a/b*y1; 15 return gcd; 16 } 17 int main() 18 { 19 scanf("%d%d",&a,&b); 20 cout<<exgcd(a,b,x,y)<<endl; 21 return 0; 22 }
加油加油加油!!!fighting fighting fighting!!!