爲何總是碰上算法
( •̀∀•́ )最討厭數論了spa
看來是時候學一學了code
度娘百科說:blog
首先, ax+by = gcd(a, b) 這個公式確定有解 (( •̀∀•́ )她說根據數論中的相關定理能夠證實,反正我信了)數學
因此 ax+by = gcd(a, b) * k 也確定有解 (廢話,把x和y乘k倍就行了)io
因此,這個公式咱們寫做ax+by = d,(gcd(a, b) | d)class
gcd(a, b) | d,表示d能整除gcd,這個符號在數學上常常見擴展
那麼已知 a,b 求 一組解 x,y 知足 ax+by = gcd(a, b) 這個公式gc
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 }
有些人喜歡極度簡化,這是病,得治(,,• ₃ •,,)好比在下di
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 }
連名字都簡化了。。。
( •̀∀•́ )解完了
睡覺~~~