gcd:
int gcd(int a, int b){ return b==0? a: gcd(b, a%b); }
擴張歐幾里得定理:
擴展歐幾里德算法是用來在已知a, b求解一組x,y使得ax+by = Gcd(a, b) =d(解一定存在,根據數論中的相關定理)。擴展歐幾里德常用在求解模線性方程及方程組中。
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;y=0;
return a;
}
int r=exGcd(b,a%b,x,y);
int t=x;
x=y;
y=t-a/b*y;
return r;
}
int main()
{
int a, b, c;
while(cin >> a >> b >> c && a+b+c)
{
int x, y;
int z = exgcd(a, b, x, y);
cout << x << ' ' << y << ' ' << z << '\n';
x*=c/z; //一組解x,y
y*=c/z;
cout << x << ' ' << y << '\n';
int t = b/z; //求ax+by = c 的最小正整數x
x = (x%t+t)%t;
y = abs((a*x - c)/b);
t = a/x; //求ax+by = c 的最小正整數y
y = (y%t+t)%t;
x = abs((b*y - c)/a);
cout << x << ' ' << y << '\n';
}
return 0;
遞推版乘法逆元:
ll inv(ll b){ return b == 1? 1: (mod-mod/b)*inv(mod%b)%mod;}