2020-2021:teams:farmer_john:jjleo:codeforces_round_608_div._2_virtual_participation
rank:350
A
B
C
D
E
题意:对一个数不断施行如下操作,$\begin{matrix} f(x) & = & \left\{ \begin{matrix} \frac{x}{2} & \mbox{if } x \text{ is even} \\ x - 1 & \mbox{otherwise } \end{matrix} \right. \end{matrix}$,直到变成$1$,中途所有经过的数字组成的序列称为$path(x)$,例如$path(15) = [15, 14, 7, 6, 3, 2, 1]$。现在求一个最大的$x$,使得它在$path(1),path(2), \dots ,path(n)$中至少出现$k$次。$(1 \le k \le n \le 10^{18})$
题解:设$g(x)$是$x$在$path(1),path(2), \dots ,path(n)$中的出现次数,通过递归可以求出任意的$g(x)$。打表可以发现分奇偶后$g(x)$是单调不增的,因此可以二分。但是直接递归会tle,需要更快的方式求出$g(x)$。找了一万年规律没找出来。看题解后恍然大悟,其实$f(x)$操作可以理解为在二进制下的操作(将最低位的$1$变成$0$,右移一位)。因此可以将$x$写成二进制,如果$x$是奇数,例如$101$,那么$101$会出现在所有$\le n$且形如$101 \dots$的数的$path$中;如果$x$是偶数,例如$100$,那么$100$会出现在所有$\le n$且形如$100 \dots$与$101 \dots$的数的$path$中。问题转变为,已知二进制位最高的几位,在低位任意加数字,求有多少$\le n$的数。只需要枚举二进制下增加的位数,设增加的位数是$k$,则对答案的贡献为$min(2^k, n - x \cdot 2^k + 1)$。
F
2020-2021/teams/farmer_john/jjleo/codeforces_round_608_div._2_virtual_participation.txt · 最后更改: 2020/06/28 11:15 由 jjleo