扩展欧几里得各类问题模板
昨天看了一下扩展欧几里得,今天找了几个模板
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
什么是乘法逆元
例如:4关于1模7的乘法逆元为多少?
4X≡1 mod 7
这个方程等价于求一个X和K,满足
4X=7K+1
其中X和K都是整数。
若ax≡1 mod f, 则称a关于模f的乘法逆元为x。也可表示为ax≡1(mod f)。
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;
}