扩展欧几里得算法
问题:求ax+by=gcd(a,b)的一组整数解
构造特解
int exgcd(int a,int b,int&x,int&y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int x1,y1;
int d=exgcd(b,a%b,x1,y1);
x=y1,y=x1-a/b*y1;
return d;
}
可以解决的问题
1.求解不定方程ax+by=c
#include<iostream>
using namespace std;
int exgcd(int a,int b,int&x,int&y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int x1,y1;
int d=exgcd(b,a%b,x1,y1);
x=y1,y=x1-a/b*y1;
return d;
}
int main()
{
int a,b,c,x,y;
cin>>a>>b>>c;
int d=exgcd(a,b,x,y);
if(c%d==0)
cout<<c/d*x<<" "<<c/d*y<<endl;
else cout<<"none"<<endl;
return 0;
}
2.求解同余方程ax≡b(mod m)
#include<iostream>
using namespace std;
int exgcd(int a,int b,int&x,int&y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int x1,y1;
int d=exgcd(b,a%b,x1,y1);
x=y1,y=x1-a/b*y1;
return d;
}
int main()
{
int a,b,m,x,y;
cin>>a>>b>>m;
int d=exgcd(a,m,x,y);
if(b%d==0)
cout<<x*b/d%m<<endl;
else cout<<"none"<<endl;
return 0;
}
3.求解乘法逆元ax≡1(mod m)
#include<iostream>
using namespace std;
int exgcd(int a,int b,int&x,int&y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int x1,y1;
int d=exgcd(b,a%b,x1,y1);
x=y1,y=x1-a/b*y1;
return d;
}
int main()
{
int a,m,x,y;
cin>>a>>m;
int d=exgcd(a,m,x,y);
cout<<(x%m+m)%m<<endl;
return 0;
}