Binary GCD 是可以 AC 的。
查看原帖
Binary GCD 是可以 AC 的。
177524
platelett楼主2022/5/26 20:52

Binary GCD 指的是按以下方法递归:

gcd(a,b)={gcd(ab,min(a,b))(a,b is odd)gcd(a/2,b/2)(a,b is even)gcd(a,b/2)(a is odd,b is even)gcd(a/2,b)(a is even,b is odd)\gcd(a,b)=\begin{cases} \gcd(|a-b|,\min(a,b))&(a,b\text{ is odd})\\ \gcd(a/2,b/2)&(a,b\text{ is even})\\ \gcd(a,b/2)&(a\text{ is odd},b\text{ is even})\\ \gcd(a/2,b)&(a\text{ is even},b\text{ is odd}) \end{cases}

直接递归是过不了的,但实现好可以 <= 700ms 通过,附上代码:

int gcd(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;
}
2022/5/26 20:52
加载中...