如题,在做 P9032 的时候,在三支 log 下写了如下的 gcd,结果被卡了一个点:
LL gcd(LL A,LL B){return B==0?A:gcd(B,A%B);}

然后我用突然想到辗转相除法好像有优化,就用了如下的代码,结果刚才那个点跑进了 2.17 秒:
LL gcd(LL A,LL B){
if(!A||!B)return A|B;
if((A&1)&&(B&1))return gcd(min(A,B),abs(A-B));
else if(A&1)return gcd(A,B>>1);
else if(B&1)return gcd(A>>1,B);
else return (gcd(A>>1,B>>1)<<1);
}

然后我就通过哪个题了,虽然不是正解。但我突然想到 C++17 及以上好像是自带 gcd 的,于是就把手写的 gcd 注释掉了,结果跑的飞快!

我想知道 C++ 的 gcd 函数是怎么实现的跑这么快的,以及日常模拟赛和 NOI 系列赛事可以用吗?我在本地试了一下 C++14 貌似用不了(
顺便问一下 __lg 能不能用啊,我不想在写 ST 表的适合预处理对数数组