Codeforces Round 1048 (Div. 1) A Cake Assignment 题解

A / d2C Cake Assignment

BC 两题题解可以看 cf 题解,不过 A 有更本质的做法

难度(个人感觉):\(\star\star\)

  • op 1 若让 Chocola 删除,那么 \(x \rightarrow x/2\)

  • op 2 若让 Vanilla 删除,那么 \(x \rightarrow x + (2^{k+1} - x) / 2\),即 \(x \rightarrow x/2 + 2^k\)

sol 1 逆推

我们可以由结果推导用了哪个操作,若操作后 \(x > 2^k\) 则使用了 op2,若 \(x < 2^k\) 则使用了 op1,显然上一步 两个数都不是 0,那么 x 不等于 \(2^k\)

逆向递推即可。这是大部分人的做法,但是实际上没有说清楚这个操作到底干了什么。

sol 2 操作的实质

还是从逆推的视角开始。如果最后一步 x 的 \(2^k\) 这位是 0,那么前一步使用了 op 1,否则使用了 op 2。

关键是,这次操作只会影响第 \(2^k\) 这一位。那么之前的操作决定了 \(2^0, 2^1,...,2^{k-1}\) 这些位。

归纳一下,倒数第二次操作决定了 \(2^{k-1}\) 这位,倒数第三次决定了 \(2^{k-2}\) 这位。设一共由 t 次操作,那么第 \(i\) 次操作决定了 \(2^{k-(t-i)}\) 这位。特别的,初始值是 \(2^k\),那么第 \(2^{k-t}\) 位是 1,而 \(i < k - t, 2^i\) 这位是 0。

那么 \(k - t\) 实质上是答案的最低的 1 的位。 \(i\) 次操作由 \(2^{k-(t-i)}\) 这位的值决定。

posted @ 2025-09-09 10:46  陈聂  阅读(87)  评论(0)    收藏  举报