扩展欧几里得算法
一.扩展欧几里得算法
题目来源:扩展欧几里得算法
#include<bits/stdc++.h>
using namespace std;
//扩展欧几里得返回的也是最大公约数
int exgcd(int a, int b, int &x, int &y)//注意:x,y引用
{
//返回gcd并求出解(引用带回)
if(b==0)
{
x = 1, y = 0;
return a;
}
int x1,y1,gcd;
gcd=exgcd(b, a%b, x1, y1);//对应第二种情况
x = y1, y = x1 - a/b*y1;
return gcd;
}
int main()
{
int n,a,b,x,y;
cin>>n;
while(n--)
{
cin>>a>>b;
exgcd(a,b,x,y);
cout<<x<<" "<<y<<endl;
}
return 0;
}
二.线性同余方程
题目来源:线性同余方程
#include<bits/stdc++.h>
using namespace std;
int n, x, y;
using LL = long long ;
//扩展欧几里得返回的也是最大公约数
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1, y = 0;
return a;
}
int x1,y1,gcd;
gcd = exgcd(b, a%b, x1, y1);
x = y1 , y = x1 - a / b * y1;
return gcd;
}
int main()
{
cin >> n;
while (n --)
{
int a, b, m;
cin >> a >> b >> m;
int d = exgcd(a, m, x, y); //此时返回的是 a,m的最大公约数d
if (b % d) puts("impossible");//如果b不是gcd(a,m)的倍数,无解
else //如果b是gcd(a,m)的倍数,有解
{
x = (LL)x * b / d % m; //解扩大b/gcd(a,m)倍
cout << x << endl;
}
}
return 0;
}