CF1271E - Common Number |
设
\(f(x) = \begin{cases} x - 1, & x \mod 2 = 1 \\ \dfrac{x}{2}, & x\mod 2 = 0 \\ \end{cases}\)
若将一个数 \(x\) 不断赋值为 \(f(x)\) 直到 \(x = 1\),则在这个过程中出现的数的集合我们称之为 \(path(x)\) ,如 \(path(7) = \{7, 6, 3, 2, 1\}\), \(path(4) = \{4, 2, 1\}\) 。给定 \(n, k\) ,求最大的数 \(m\) 使得在 \(1\) 到 \(n\) 内至少有 \(k\) 个数的 \(path\) 中出现了 \(m\) 。
\(1 \leq k \leq n \leq 10 ^ {18}\)
赛时做到这种题,我就预感到自己会怎么挂了(
当时想到,其实 \(f(x)\) 就类似于一个不断右移的过程。对于一个数 \(m\) ,当 \(m\) 为奇数时,有多少个数的 \(path\) 中出现了它取决于有多少个数的二进制形式以 \(m\) 为前缀。偶数会略有差别,但差别不大。然后就想找一找要在 \(m\) 后面接上多长的后缀,才能使得个数大于等于 \(k\) ,然后 \(m\) 就去 \(n\) 的一个前缀云云。但发现奇怪的情况很多,不是很能做,然后又一直乱改没有认真论证,然后就挂了。
其实应该静下心来认真想一想……不应该没做出来的,笑死。
然后翻了翻网上的题解,发现了打表的奇怪做法。就是打表发现 \(m\) 的出现次数是分奇偶分别递减的,然后就可以二分……其实这也很好理解,不用打表应该也可以想到。可惜还是错过了。
更正统的做法是,