现在有两个数a,b,要求a,b的最大公约数。欧几里得是个十分有用的定理:gcd(a,b) = gcd(b,a%b)
int gcd(int a, int b) {
if(b == 0) return a;
else return gcd(b,a%b);
}扩展欧几里得:
现在知道了a和b的最大公约数是gcd,那么,我们一定能找到这样的x和y,使得:a*x+b*y=gcd。有多解是一定的,但是我们只要找到一组特殊的解x0和y0,那么就可以用x0和y0表示出整个不定方程的通解:
x=x0+(b/gcd)*t
y=y0-(a/gcd)*t
int e_gcd(int a, int b, int &x, int &y) {
if(b==0) {
x=1;
y=0;
return a;
}
int ans = e_gcd(b,a%b, x, y);
int temp = x;
x = y;
y = temp-(a/b)*y;
return ans;
}
7091

被折叠的 条评论
为什么被折叠?



