6.1.3 最大公约数
最大公约数
先给两种写法
简单,但是慢
int gcd (int a, int b) {
return b ? gcd (b, a % b) : a;
}
稍微难写一点,但是飞快
int gcd (int a, int b) {
if (a == 0 || b == 0) return a | b;
int az = __builtin_ctz (a);
int bz = __builtin_ctz (b);
int z = min (az, bz), diff;
b >>= bz;
while (a) {
a >>= az;
diff = b - a;
if (!diff) break;
az = __builtin_ctz (diff);
b = a < b ? a : b;
a = diff < 0 : -diff : diff;
}
return b << z;
}
注意,如果 \(a,b\) 为 long long
,那么一定要用 __builtin_ctzll
代替 __builtin_ctz
,否则会非常慢
仅仅修改了这一个地方,就快了四秒多,千万别忘了