擴展歐幾里得各類問題模板
昨天看了一下擴展歐幾里得,今天找了幾個模板
1.歐幾里得(最大公約數,最小公倍數)
int gcd(int a,int b)
{
if((b==0) return a;
else gcd(b,a%b);
}
2.擴展歐幾里得求最小整數解
給出 a*x+b*y=c
int e_gcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
int ans,tep;
ans=gcd(b,a%b,x,y);
tep=x;
x=y;
y=tep-a/b*y;
}
這是求的 a*x+b*y=gcd(a,b) 如果 c%gcd(a,b)==0 ,就說明有解,
最小整數解爲 b=b/gcd(a,b) x=x*(c/gcd(a,b)) x=(x%b+b)%b
3.最小乘法逆元
感覺和最小整數解差不多,就是最後 a*x + m*y = 1
什麼是乘法逆元
int cal(int a,int m)
{
int x,y;
int gcd=e_gcd(a,m,x,y);
if(1%gcd!=0) return -1;
x*=1/gcd;
m=abs(m);
int ans=x%m;
if(ans<=0) ans+=m;
return ans;
}