扩展欧几里得
贝祖等式
给定两个整数 ,必存在整数 使得 且 。
算法分析
因为
可得
继而
故而
#include<iostream>
#include<algorithm>
using namespace std;
void exgcd(int a, int b, int &x, int &y){
if (!b){
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
return;
}
int main(){
int n; cin >> n;
while (n -- ){
int a, b, x, y; cin >> a >> b;
exgcd(a, b, x, y);
printf("%d %d\n", x, y);
}
}
时间复杂度分析
这题的时间复杂度和欧几里得算法一样。欧几里得算法时间复杂度 ,总时间复杂度 。
线性同余方程
给定 组数据 ,对于每组数求出一个 ,使其满足 ,如果无解则输出
impossible
。
由
可得
由之前的贝祖等式可知,只要 ,我们就可以利用扩展欧几里得算法求解线性同余方程。
#include<iostream>
#include<algorithm>
using namespace std;
void exgcd(int a, int b, int &x, int &y){
if (!b){
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
}
int main(){
int n; cin >> n;
while (n -- ){
int a, b, m; cin >> a >> b >> m;
int x, y;
exgcd(a, m, x, y);
int gcd = a * x + m * y;
if (b % gcd == 0)
cout << (long long)b / gcd * x % m << endl;
else
cout << "impossible" << endl;
}
}
最后更新于