扩展欧几里得算法
裴蜀定理:若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.
扩展欧几里得:
用于求解方程 ax+by=gcd(a,b) 的解


代码:
# include <bits/stdc++.h>
using namespace std;
void exgcd(int a , int b, int& x , int& y){
if (!b){
x = 1, y = 0;
return;
}
exgcd(b,a%b,x,y);
int t = y;
y = x - a/b * y;
x = t;
}
int main(){
int n;
scanf("%d",&n);
while (n--){
int a,b,x,y;
scanf("%d%d",&a,&b);
exgcd(a,b,x,y);
printf("%d %d\n",x,y);
}
return 0;
}
习题:线性同余方程

题解:求出一个x,使得ax % m = b, 也就是 ax + my = b, 对于gcd(a,m) = d, 我们知道ax + m*y = d 一定成立,那么 我们求aX + mY = b , 等式两边都乘以d/b,就是裴蜀定理,ax0 * b/d = ax , x = x0 * b/d,要求在int范围,我们结果再mod m 就可
code:
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int exgcd(int a, int b, int &x, int &y) // 扩展欧几里得算法, 求x, y,使得ax + by = gcd(a, b)
{
if (!b)
{
x = 1; y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a / b) * x;
return d;
}
int main(){
int n;
scanf("%d",&n);
while (n--){
int a, b, m;
int x, y;
cin >> a >> b >> m;
int d = exgcd(a,m,x,y);
if (b%d) cout << "impossible" << endl;
else {
cout << (LL)x*(b/d) % m << endl;
}
}
return 0;
}

浙公网安备 33010602011771号