设蘑菇 $0$ 为 A,其他蘑菇的种类记为 $0$ 或 $1$。算法分两段:先用编码询问积累一批种类已确定的蘑菇,再用它们作参照,大批量统计剩余蘑菇。
编码阶段的核心是一个可逆的有符号子集和矩阵。一次逻辑询问给出若干未知位之和与另一些未知位之和的差。递归地,若两个较小编码分别产生 $a_i$、$b_i$,引入新位 $z_i$,便询问 $P_i=a_i+b_i$ 与 $R_i=a_i-b_i+z_i$。由 $P_i+R_i=2a_i+z_i$ 的奇偶性先求 $z_i$,再恢复 $a_i,b_i$,最后递归解码。所能恢复的位数满足 $f(1)=1$ 以及 $f(q)=f(\lceil q/2\rceil)+f(\lfloor q/2\rfloor)+\lfloor q/2\rfloor$;特别地,$f(2^k)=2^k(1+k/2)$。
每个逻辑询问都能翻译成一次或若干次 use_machine。已知两类蘑菇各取作参照,让正系数未知位夹在同类参照之间、负系数未知位夹在另一类参照之间;连接两段所产生的额外变化是已知常数。在序列开头再放一个新蘑菇,返回值的奇偶性便确定它的种类。因此,每次实际机器询问除了提供子集和,还确定一个新蘑菇。当参照数量不足以容纳整行时,代码将该行拆成几次询问,再相加还原结果。
采用哪种编码、何时结束初始化,由代码内的固定决策表按当前已知的两类数量 $(a,b)$ 选择。该表的选择和其最坏界都经过离线穷举验证;提交时只查表,不进行搜索。
统计阶段令 $c$ 为当前已知蘑菇较多的一类。一次询问可以排列成 $c_0,u_1,v_1,c_1,\ldots,u_p,v_p,c_p,z$,其中 $z$ 仅在还需处理一个奇数位置时加入。这样一次可处理至多 $2a-1$ 个未知蘑菇,末尾 $z$ 的种类仍可从奇偶性直接得出。每对 $(u,v)$ 的贡献还包含一项 $u\mathbin{\mathrm{xor}}v$,所以临时计数需要校正。
把以 A、B 为参照处理过的配对分别收集。对每组配对构造原序、对内交换序、交错交换序及其对内交换序。四次拼接询问中的跨组边界项相互抵消,所得结果恰为 $2(D_A-D_B)$,其中 $D_c$ 是该组两端种类不同的配对数。扣掉 $D_A-D_B$,就得到准确答案。