更快地求gcd的方法:Stein算法
你肯定会辗转相除法
如果你的瓶颈在 \(gcd\) ,担心时间过不了,不妨试试 stein 算法
Stein 算法的关键就在于除2操作,具体表现如下:
\(a偶b偶:gcd(a, b) = 2 * gcd(a/2, b/2)\)
\(a偶b奇:gcd(a, b) = gcd(a/2, b)\)
\(a奇b偶:gcd(a, b) = gcd(a, b/2)\)
\(a奇b奇:gcd(a, b) = gcd(|a-b|, min\){\(a, b\)}\()\)
我们可以用位运算优化
见代码
long long gcd(long long x,long long y){
if(!x) return y;
if(!y) return x;
long long t=__builtin_ctzll(x|y);
x>>=__builtin_ctzll(x);
//__builtin_ctzll是GCC内置函数,计算一个数的二进制表示末尾0的个数,跑得很快
while(y){
y>>=__builtin_ctzll(y);
if(x>y) swap(x,y);
y-=x;
}
return x<<t;
}

浙公网安备 33010602011771号