题目描述
求关于$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 }