ACM數論之旅4---擴展歐幾里德算法(歐幾里德(・∀・)?是誰?)


為什么老是碰上

擴展歐幾里德算法

( •̀∀•́ )最討厭數論了

看來是時候學一學了

 

度娘百科說:

首先, ax+by = gcd(a, b) 這個公式肯定有解 (( •̀∀•́ )她說根據數論中的相關定理可以證明,反正我信了)

所以 ax+by = gcd(a, b) * k 也肯定有解 (廢話,把x和y乘k倍就好了)

所以,這個公式我們寫作ax+by = d,(gcd(a, b) | d)

gcd(a, b) | d,表示d能整除gcd,這個符號在數學上經常見

 

 

那么已知 a,b 求 一組解 x,y 滿足 ax+by = gcd(a, b) 這個公式

 

 1 #include<cstdio>
 2 typedef long long LL;
 3 void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d){
 4     if (!b) {d = a, x = 1, y = 0;}
 5     else{
 6         extend_Eulid(b, a % b, y, x, d);
 7         y -= x * (a / b);
 8     }
 9 }
10 int main(){
11     LL a, b, d, x, y;
12     while(~scanf("%lld%lld", &a, &b)){
13         extend_Eulid(a, b, x, y, d);
14         printf("%lld*a + %lld*b = %lld\n", x, y, d);
15     }
16 }

 

 

有些人喜歡極度簡化,這是病,得治(,,• ₃ •,,)比如在下

1 void ex_gcd(LL a, LL b, LL &d, LL &x, LL &y){
2     if(!b){d = a; x = 1; y = 0;}
3     else{ex_gcd(b, a%b, d, y, x); y -= x*(a/b);}
4 } 

 

連名字都簡化了。。。

 

 

 

( •̀∀•́ )解完了

睡覺~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM