淡 | usaco feb pt t2

首先考虑 \(a\ge 0,b\ge 0\) 的情形。判掉 \(c<0\)\(d<0\) 的情况。那么倒着考虑的话,相当于可以让 \(c,d\) 之间较大的数减去较小的数,直到变成 \((a,b)\)。那么从 \((c,d)\) 变成 \((c,d\bmod c)\) 的过程只会进行 \(O(\log n)\) 轮,暴力做复杂度是对的。

\(a\le 0,b\le 0\) 则只需要将 \(a,b,c,d\) 都取反。那么我们只用考虑 \(a,b\) 异号的情况。不妨设 \(a<0<b\),且 \(|a|\le |b|\)。考虑转化为 \(a,b\) 同号。

先进行若干次 \(b+=a\) 得到 \((a,b),(a,b+a),\ldots,(a,b+2a),\ldots\),再进行一次 \(a+=b\),得到 \((a+b,b),(2a+b,a+b),\ldots\)。设 \(k\) 是最大的满足 \(ka+b\ge 0\) 的非负整数。对于 \((a+b,b),(2a+b,a+b),\ldots,(ka+b,(k-1)a+b)\) 这些数对,可以转化为 \(a,b\ge 0\) 的情形,只需要改动一下上面的做法,把这些数对包装起来再执行上面的算法。而对于 \(((k+2)a+b,(k+1)a+b),((k+3)a+b,(k+2)a+b),\ldots\) 这些数对,同理可以转化到 \(a,b\le 0\) 的情形。唯一的问题在于 \(((k+1)a+b,ka+b)\),我们递归求解。递归的层数是 log 级别的,每一层只用调用 \(O(1)\) 次上面的算法,于是总复杂度就是两只 log。

还有若干 corner cases,在此略过不提。

我考场的石山代码,惨被卡常两个测试点,于是成为了离 ak 最近的一次:

posted @ 2025-02-25 20:28  Network_Error  阅读(46)  评论(2)    收藏  举报