You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
2.0 KiB

2 years ago
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
/**前导知识:
a,b,x,y,使ax+by=gcd(a,b)
gcd(a,b)|a,gcd(a,b)|b,agcd(a,b)bgcd(a,b)a+bgcd(a,b)
1ax+by=gcd(a,b)
*/
/**
*
* @param a
* @param b
* @param x ax
* @param y bx
* @return a,b
*/
int exgcd(int a, int b, int &x, int &y) {
if (!b) { //如果b==0
x = 1, y = 0; //a与0的最大公约数肯定是0所以给出一个最小解即可比如x=1,y=0。
return a;
}
//如果b!=0
int d = exgcd(b, a % b, y, x);//d是最大公约数,这里a和b颠倒了所以系数也需要翻转一下
//下面的是重点,在变换过程中,系数会发生变化:
/**
1 by+(a%b)x=gcd(a,b)
2a % b=a- a/b * b aba/b
3 21
by+(a- a/b * b)x = gcd(a,b)
b(y-a/b*x)+a*x=gcd(a,b)
axb y-a/b*x , y=y-a/b *x, y-= a/b *x
*/
y -= a / b * x;
return d;
}
//利用扩展欧几里德求逆元
int inv(int a, int b) {
int x, y;
int gcd = exgcd(a, b, x, y);
//m与n不互质乘法逆元不存在
if (1 != gcd) return -1;
else return (x + b) % b; //为了使余数一定为正数,模运算系统的特性
}
int main() {
cout << inv(13, 10) << endl;
return 0;
}