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 }
posted @ 2020-01-29 11:11  popozyl  阅读(155)  评论(0编辑  收藏  举报