扩展欧几里德算法
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
== potaty: ==
{{{
void egcd(ll a,ll b,ll c,ll &xx,ll &yy)
{
if (b==0)
{
xx=c/a;
yy=0;
return ;
}
ll x1,x2;
egcd(b,a%b,c,x1,x2);
xx=x2;
yy=x1-(a/b)*x2;
}
}}}
== erosion: ==
{{{
LL gcd(LL a,LL b)
{
LL temp;
//此行错误。不加就是对的。 //if (a<0) a=-a; if (b<0) b=-b;
while (b!=0) { temp=b; b=a%b; a=temp; }
return a;
}
//传入的a,b要保证是互质的(因为最后a*1+b*0=1时要保证a为1)
void _gcd(LL a,LL b,LL &x,LL &y)
{
if (b==0) { x=1,y=0; return; }
_gcd(b,a%b,x,y);
LL temp=y;
y=x-a/b*y; x=temp;
}
}}}
potaty:
void egcd(ll a,ll b,ll c,ll &xx,ll &yy)
{
if (b==0)
{
xx=c/a;
yy=0;
return ;
}
ll x1,x2;
egcd(b,a%b,c,x1,x2);
xx=x2;
yy=x1-(a/b)*x2;
}
erosion:
LL gcd(LL a,LL b)
{
LL temp;
//此行错误。不加就是对的。 //if (a<0) a=-a; if (b<0) b=-b;
while (b!=0) { temp=b; b=a%b; a=temp; }
return a;
}
//传入的a,b要保证是互质的(因为最后a*1+b*0=1时要保证a为1)
void _gcd(LL a,LL b,LL &x,LL &y)
{
if (b==0) { x=1,y=0; return; }
_gcd(b,a%b,x,y);
LL temp=y;
y=x-a/b*y; x=temp;
}