考虑取 a=\{2^0,2^0,2^1,2^2,\dots,2^{29}\},这个序列满足 a_i=\sum\limits_{j=0}^{i-1}a_j 的性质,当 d 被加入 a 中后,在 d 及其右侧的位置,该性质会被破坏。
从大往小考虑 a 中的每一项,直到找到 a 中最大的满足性质的项 2^i,我们知道 d 的位置恰好在这一项之后。令 S=\{2^i\},我们依次尝试往 S 中加入 2^{i-1},2^{i-2},\dots,2^0,检查 S 的和是否超过 d,若超过则删除,不超过则保留即可在 \lceil\log_2 W\rceil=30 次操作内得到 d 的值。
int ans = 0, pw = 729;
for (int i = 6; i >= 0; i--) {
int a = ans + pw - 1, b = ans + pw * 2 - 1, c = ans + pw * 3 - 1;
int res = ans ? compare_tastiness({a, b}, {c, ans - 1}) : compare_tastiness({a, b}, {c});
ans += pw * (res + 1), pw /= 3;
}
return ans;