点击查看代码
#include<cstdio>
#pragma warning(disable:4996)
//给定a、b,通过欧几里得算法求解a和b的最大公约数gcd(a,b)
int gcd(int a, int b) {
if (b == 0) return a;
else return gcd(b, a % b);
}
//给定a、b,通过扩展欧几里得算法求解ax+by=gcd(a,b)的x和y
int exgcd(int a, int b, int& x, int& y) { //求解x和y用引用型
//根据欧几里得算法,当b为0时,(x,y)=(1,0),返回a
if (b == 0) {
x = 1; y = 0; return a;
}
//g存储a和b的最大公约数。当b不为0时,将(a,b)改为(b,a%b)进行递归计算
int g = exgcd(b, a % b, x, y);
int temp = x; //用temp存放底层x的值,temp=x(old)
x = y; //将上层x更新为底层y的值,x=y(old)
y = temp - a / b * y; //将上层y更新为y=x(old)-a/b*y(old)
return g; //g是最大公约数
}