想象一下,如果我们询问 x=(0111)2x=(0111)_2,会返回什么呢?设 y=(cdef)2y=(\overline{cdef})_2

  • 如果 c=0c=0,则 yy 计入答案;
  • 如果 c=1c=1,则 yy 不计入答案;

因此返回的结果 rr 就是 {an}\{a_n\} 中满足 c=0c=0 的项的个数。也就是说,{an}\{a_n\} 中满足 c=1c=1 的项的个数为 nrn-r,这一位对 a1+a2++ana_1+a_2+\ldots+a_n 的贡献是 8×(nr)8 \times (n-r)

同理,我们可以用 44 次交互分别出 44 个二进制位对 a1+a2++ana_1+a_2+\ldots+a_n 的贡献。我们把 44 个贡献相加,就可以算出 a1+a2++ana_1+a_2+\ldots+a_n 的值了。

#include <bits/stdc++.h>
#include "conversion.h"
using namespace std;
int main()
{
    int n = start();
    int s = 0;
    for (int i = 1; i <= 8; i <<= 1)
        s += i * (n - interact(15 - i));
    stop(s);
    return 0;
}