0%

最大公约数(GCD)

欧几里德算法

GCD,也叫辗转相除法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

int gcd(int ai, int bi)
{
return bi ? gcd(bi, ai % bi) : ai;
}

int main()
{
int n;
cin >> n;
while (n--)
{
int ai, bi;
scanf("%d%d", &ai, &bi);
printf("%d\n", gcd(ai, bi));
}
return 0;
}

扩展欧几里德算法

扩展欧几里德算法可以用于求解逆元,利用的原理就是 $a \times x + b \times y = 1 $。

如求 的逆元:

此时就可使用扩展欧几里德算法求解,公式为 其中求出的 $x$ 就是逆元。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;

int exgcd(int ai, int bi, int &xi, int &yi)
{
if (!bi)
{
xi = 1, yi = 0;
return ai;
}
int res = exgcd(bi, ai % bi, yi, xi);
yi -= ai / bi * xi;
return res;
}
//如何理解这里的递归和yi的更新

int main()
{
int n;
cin >> n;
while (n--)
{
int ai, bi, xi, yi;
scanf("%d%d", &ai, &bi);
exgcd(ai, bi, xi, yi);
printf("%d %d\n", xi, yi);
}
return 0;
}