左方之地
\(\mathcal{Sequence\ Solution}\)
事实上是 左方之地 \(\mathcal{Solution}\)。
出题人题解。
好像出屑了。
简化版题意:
给定 \(n,k\),求将 \(0,1,2\dots 2^n-1\) 排成一排,使得对任意两个相邻的数 \(a,b\),满足 \(\operatorname{popcount}(a\operatorname{xor}b)=k\)。
其中 \(\operatorname{popcount}(x)\) 的定义为 \(x\) 的二进制表示中值为 \(1\) 的位数。
好像不需要了,已经简化过了。
暴力 dfs 是必然能过的,这里理论上应该给一个复杂度证明。
首先你可以判断一下有无解。(见下)
然后考虑一下,大概是不会回溯的,,,
然后预处理一下就 done 了。
简略证法如上。
然后现在好像我不会给特别严谨的证明,,,
如果有牛逼老哥证出来了可以私信/评论我,,,
大概是来自 @shenmadongdong 的证明思路,RC尝试详细化了一下:
考虑构造一张无向图,每个点的出度是 \(\dbinom{n}{k}\)。
然后相当于求一条 \(\mathcal{Hamilton}\) 路。
然后不会了。
鉴于不会上面的证明,接下来考虑一个不是啥爆搜,直接构造,复杂度必然正确的方法。
类似格雷码。
首先考虑一些特殊的情况。
\(n=0\),无论 \(k\) 怎样都可以成立。
\(n=1\),当且仅当 \(k=1\) 时可以成立,其他都不可以成立。
接下来不妨设 \(n\ge 2\)。
尝试考虑证明有解等价于 \(n\ge k+1\) 且 \(k\bmod 2=1\)。
首先,显然的,\(n\le k\) 时无解。(最多仅能达到 \(2\) 个数)
接下来考虑 \(k\bmod 2=0\) 时的情况。
引理 \(1\):长为 \(n\) 的二进制串中 \(1\) 个数为奇数/偶数的串的个数相等。
相关证明方法可以自己查询,由于结论比较简单此处不再赘述。
对于任意的 \(a\),其下一位数都只会更改偶数个二进制位的值,因此可以得到所有项的二进制位 \(1\) 的个数均与首项相同,由引理 \(1\) 知矛盾。
接下来证 \(n\ge k+1\) 且 \(k\bmod 2=1\) 时一定有解。
先考虑 \(n=k+1\) 时的情况。
先构造出一组 格雷码 \(b_1,b_2\dots b_{2^n}\),可得 \(\operatorname{popcount}(b_i\operatorname{xor}b_{i+1})=1(i=1,2\dots 2^n-1)\)。
然后我们将 \(b_j(j\bmod 2=0)\) 这些项全部反转(即,异或上 \(2^n-1\))。
由于 \(b_2,b_4\dots b_{2^{n}}\) 的 \(\operatorname{popcount}\) 的奇偶性全部相同,且反转之前两两不同,可以得知反转后两两不同,且此时的 \(b_i\) 满足:\(\operatorname{popcount}(b_i\operatorname{xor}b_{i+1})=k(i=1,2\dots 2^n-1)\)。
设这样得到的序列为 \(a_1,a_2\dots a_{2^n}\)。
接下来考虑如下的序列:\(c_1,c_2,c_3\dots c_{2^n}\),满足 \(c_i=a_i\operatorname{xor}(2^n+2^{k-1}-1)\)。
可以显然地知道 \(\operatorname{popcount}(c_i\operatorname{xor}c_{i+1})=k(i=1,2\dots 2^n-1)\)。
同时,\(c_i\) 和 \(a_i\) 不重复,且两个数列一起构成了 \(0,1\dots 2^{n+1}-1\) 的排列。
同时,\(\operatorname{popcount}(c_{2^n}\operatorname{xor}a_{2^n}=k)\)。
因此可以将 \(a,c\) 两个序列按照 \(a\) 正序,\(c\) 倒序的顺序拼接起来,就得到了 \(n+1\) 时的解。
综上,原命题得证。
代码就不放了。

浙公网安备 33010602011771号