关于 std 自带的 gcd 与辗转相除法的移位优化与卡常
  • 板块学术版
  • 楼主f_hxr_
  • 当前回复13
  • 已保存回复13
  • 发布时间2025/7/21 15:06
  • 上次更新2025/7/21 19:52:55
查看原帖
关于 std 自带的 gcd 与辗转相除法的移位优化与卡常
754467
f_hxr_楼主2025/7/21 15:06

如题,在做 P9032 的时候,在三支 log\log 下写了如下的 gcd,结果被卡了一个点:

LL gcd(LL A,LL B){return B==0?A:gcd(B,A%B);}

然后我用突然想到辗转相除法好像有优化,就用了如下的代码,结果刚才那个点跑进了 2.172.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 表的适合预处理对数数组

2025/7/21 15:06
加载中...