[拓展欧几里得exGcd]

题目描述

求关于$x$的同余方程$$ax=1(mod~~b)$$的最小正整数解。

输入输出格式

输入格式:

一行,包含两个正整数$a$,$b$用一个空格隔开。

输出格式:

一个正整数$x$,即最小正整数解。输入数据保证一定有解。


裴蜀定理:关于$x$,$y$的方程$ax+by=c$有解当且仅当$gcd(a,b)|c$

令 $c = gcd(a,b)$

由 欧几里得算法 得

    $$gcd(a,b) = gcd(b,a~mod~b)$$

  所以原式可化为$$ax+by=gcd(a,b)$$

          $$ax + by = gcd(b,a~mod~b)$$

         $$bx_{0} + (a~mod~b)y_{0} = gcd(b,a~mod~b)$$

  所以$$ax+by=bx_{0}+(a-lfloorfrac{a}{b} floor*b)~y_{0}=ay_{0}+b(x_{0}-lfloorfrac{a}{b} floor~y_{0})$$

所以 $$x=y_{0}~~y=x_{0}-lfloorfrac{a}{b} floor~y_{0}$$

考虑他的一组特解:

$$b=0时,x=1,y=0$$

求上述方程的所有解
假设求出的该方程的一组特解$x=x_{0},y=y_{0}$,则该方程的所有解为$$x=x_{0}+frac{k*b}{gcd(a,b)},y=y_{0}-frac{k*a}{gcd(a,b)}$$

代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 int a,b,x,y;
 6 int exGcd(int a,int b,int &x,int &y)
 7 {
 8     if(!b)
 9     {
10         x = 1;
11         y = 0;
12         return a;
13     }
14     exGcd(b,a%b,x,y);
15     int t = x; x = y; y = t - a/b * y;
16 }
17 
18 int main()
19 {
20     scanf("%d%d",&a,&b);
21     exGcd(a,b,x,y);
22     printf("%d",(x % b + b) % b);
23     return 0;
24 }
原文地址:https://www.cnblogs.com/-Wind-/p/10631483.html