左方之地

\(\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\) 时的解。

综上,原命题得证。

代码就不放了。

posted @ 2021-12-06 21:38  Rolling_Code  阅读(159)  评论(0)    收藏  举报