拓展欧几里得法求逆元

 板子:

x即为最终答案,x可能为负数,加模数即可

乘法逆元 - OI Wiki (oi-wiki.org)

void exgcd(int a, int b, int& x, int& y) {
	if (b == 0) {
		x = 1, y = 0;
		return;
	}
	exgcd(b, a % b, y, x);
	y -= a / b * x;
}

使用: 

	exgcd(a, n + 1, x, y);//x就是逆元
	while (x <= 0)x += n + 1;

原理:

最大公约数 - OI Wiki (oi-wiki.org)

拓展欧几里得法求逆元_第1张图片

拓展欧几里得算法: 

int Exgcd(int a, int b, int &x, int &y) {
  if (!b) {
    x = 1;
    y = 0;
    return a;
  }
  int d = Exgcd(b, a % b, x, y);
  int t = x;
  x = y;
  y = t - (a / b) * y;
  return d;
}

 

你可能感兴趣的:(板子,算法,数据结构,数学,数论)