gcd(a,b)=⎩⎨⎧gcd(∣a−b∣,min(a,b))gcd(a/2,b/2)gcd(a,b/2)gcd(a/2,b)(a,b is odd)(a,b is even)(a is odd,b is even)(a is even,b is odd)
直接递归是过不了的,但实现好可以 <= 700ms 通过,附上代码:
intgcd(int a, int b){
int az = __builtin_ctz(a);
int bz = __builtin_ctz(b);
int z = min(az, bz);
b >>= bz;
while (a) {
a >>= az;
int diff = a - b;
az = __builtin_ctz(diff);
b = min(a, b), a = abs(diff);
}
return b << z;
}