您的位置:首页 > 其它

欧几里得 扩展欧几里得

2016-08-10 15:35 211 查看

1.GCD

int gcd(int a, int b)
{
if(!b) return a;
return gcd(b,a%b);
}


2.扩展欧几里得

求a和b的最大公约数,

求整数x和y,使得ax+by=gcd(a,b)

void  exgcd(int a, int b, int& d, int& x, int& y)
{
if(!b){ d = a; x = 1; y = 0;}
else{ exgcd(b, a%b, d, y, x); y -= a/b*x; }
}


得到x和y后,可继续得到ax+by=c的整数解,下面计算了x

bool solve(int a, int b,int c, int& x,int& y)
{
int d;
exgcd(a, b, d, x, y);
if(!d || c%d) return false;
x *= c/d;
y *= c/d;
a /= d;
b /= d;
if(a<0) a=-a;
if(b<0) b=-b;
((x %= b) += b) %= b;//此时x+mb,y-ma都是解,m为自然数
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数论 欧几里得 gcd acm