m和n不全为零
一定存在gcd(m,n)==xm+ny
模板1
int exgcd(int m,int n,int &x,int &y)//返回gcd(m,n)
{
int x1,y1,x0,y0;
x0=1;
y0=0;
x1=0;
y1=1;
x=0;
y=1;
int r=(m%n+n)%n;
int q=(m-r)/n;
x=0,y=1;
while(r)
{
x=x0-q*x1;
y=y0-q*y1;
x0=x1;
y0=y1;
x1=x;
y1=y;
m=n;
n=r;
r=m%n;
q=(m-r)/n;
}
return n;
}
int main()
{
int x,y;
int m=6 ;
int n= 2;
int a =exgcd(6,2,x,y);
printf("6*%d + 2*%d = %d \n",x,y,a );
return 0;
}
6*0 + 2*1 = 2
[Finished in 0.0s]
模板2
x y为全局变量,不需要初始化
ll exgcd(ll a, ll b)
{
if(b==0){
x=1,y=0;
return a;
}
ll d=exgcd(b,a%b);
ll t=x;
x=y;
y=t-(a/b)*y;
return d;
}
ax+by==gcd(a,b)
对于解一般不定式 ax+by==c是上式的整数倍
即仅当c%gcd(a,b)为0时有整数解 x,y
x=x0*c/gcd(a,b);
y=y0*c/gcd(a,b);
题目经常求最小的正x值有一个神奇的公式
x=x+b/gcd(a,b)*k
y=y-a/gcd(a,b)*k(k为任意整数)
即对每组x,y值都有ax+by==c成立
所以求得x后,
令s=b/gcd(a,b);
x=x(x%s+s)%s;
【扩展欧几里得【数论】x为最小正值
推荐阅读
- HDU 5528【2015长春现场赛 B】 Count a * b
- 类欧几里得算法|[类欧几里得算法 数论] BZOJ 2987 Earthquake
- [数论] Codeforces 819D R #421 D.Mister B and Astronomers & 516E R #292 E. Drazil and His Happy Friends
- 模板 poj2947 Widget Factory 高斯消元
- 【扩展欧几里得】练习题
- 数论|hdu 5322 Hope(分治+NTT)
- HDU 5528 Count a × b
- 线性同余方程组
- 数论|AtCoder Beginner Contest 156 C.Rally