POJ - 数论(线性同余方程) - 青蛙的旅行
https://vjudge.net/contest/353158#problem/A
解线性同余方程 : ax + by = c 的一般步骤:
1. 求出 m = gcd(a,b)
2. 若 c % m != 0 -> 方程组无解
3. 若 c % m == 0 -> 将方程 ax + by = c 等式两边同除以 m , 得到 a' x + b' y = c'
接下来,先解 a'x + b'y = 1 : 利用拓展欧几里得可解, 得到 x0,y0。
即满足 : a' * x0 + b' * y0 = 1
然后将方程两边同乘 c' : a' * (c'x0) + b' * (c'y0) = c'
所以,方程 a'x + b'y = c' 的一组特解为 : x1 = c'x0, y1 = c'y0
由于 ax + by = c -> a'x + b'y = c' 是同解变换, 故 x1,y1也是原方程的一组特解.
最后, 对于任意实数 t, 还可以得到 x1 + b't , y1 - a't 也是方程的特解 (不妨代入检验 , t 消掉了)
两个函数的写法:
1 #include <iostream> 2 using namespace std; 3 typedef long long ll; 4 ll gcd(ll a,ll b){ 5 if(b == 0)return a; 6 else return gcd(b,a%b); 7 } 8 9 void exgcd(ll a,ll b,ll& x,ll& y){ 10 if(b == 0){ 11 x = 1; y = 0; 12 }else{ 13 exgcd(b,a%b,y,x); 14 y -= x*(a/b); 15 } 16 }
---- suffer now and live the rest of your life as a champion ----