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;
}