被个三进制下位运算题搞自闭了,琢磨了好久才有了一个看似贼简单的做法,故记录一下。
先考虑怎么用二进制模拟三进制。
用 \(01\) 串 \(s_0,s_1,s_2\) 依次表示某数在三进制下,数位为 \(0,1,2\) 的位的集合。
不难发现 \(s_0,s_1,s_2\) 两两无交。
那么对于两个数的三进制下位运算,就可以通过枚举两数的 \(s_0,s_1,s_2\),得到两数在三进制下数位为 \(0,1,2,3,4\) 的位的集合。且这些集合也两两无交。
之后再通过位运算的定义,把五个集合重新整理成新的 \(s_0,s_1,s_2\)。
复杂度是 \(O(9)\) 的(因为需要枚举 \(s_0,s_1,s_2\))。
类似的,这种做法也可以推广到 K 进制下,复杂度是 \(O(K^2)\) 的。