2016-01
在 n*n 的二维数组中填入 [0, n) 区间内的整数,如果数组中没有两个相同元素在同一行或同一列(即各行各列都是 0~n-1 的全排列),就称这个数组为 n 阶拉丁方。
(既然是在程序员网站上写,当然要改成从 0 开始计数)
两个 n 阶拉丁方可以逐个位置配对,合成一个元素类型为有序对 (x, y) 的二维数组。x, y 都在 [0, n) 中取值,也就是说 (x, y) 的不同取值有 n^2 个。如果数组中恰好出现所有 n^2 个不同的有序对(每个有序对出现一次),就称两个 n 阶拉丁方正交。
关于正交拉丁方有经典结论:2, 6 阶正交拉丁方不存在,其余阶数均存在。
现在请问,最多有多少个两两正交的 n 阶拉丁方?你只需回答(1)n 为素数;(2)n 为 2 的正整数次幂的情况。
2016-02
考虑 R^n 空间中所有各个坐标均为 0 或 1 的点(共有 2^n 个),它们构成一个 n 维单位超立方体的 2^n 个顶点。
现在用若干个 n-1 维超平面覆盖这些点(n-1 维超平面,即由方程 Sum( a_i*x_i | i=1..n) + b = 0 确定的超平面,其中所有 a_i 不全为零),显然用两个平面 x_1=0, x_1=1 就够了。
请问,若要覆盖除原点 (0, ... , 0) 之外的所有 2^n-1 个点(不能覆盖原点),最少需要几个超平面?
2016-03
做此题前请先看这里的 2015-12 题目,之后再看下面的加强题:
请问,C_4 在简单图 G 的出现次数与 G 的最常见子图的出现次数之比的最大值是多少?并举出一个取到最大值的 G 。
注意,这里的最常见子图允许并列第一。
2016-04
Alice 和 Bob 的日常(误):Alice 手中有两个区间 [1, N] 内的不同整数,Bob 有这两个整数中的一个。以上规则以及 N 的值两人都知道。两人可以通过一条双向信道通信,问最少传输多少个二进制位,可以使 Alice 保证知道 Bob 拿到的是哪个整数?Alice 和 Bob 可以事先商定一个通信协议,但是一旦双方拿到自己手中的数,就只能通过信道进行交流。
再次提醒:对给定的通信协议,我们只考虑最坏情况。
答案
2016-01
先证明对任意大于 1 的 n ,最多有 n-1 个两两正交的 n 阶拉丁方。
首先注意到如果有两个正交拉丁方,将其中一个方阵的 0~n-1 随意置换仍然是拉丁方,且仍然与另一个拉丁方正交。因此对一组两两正交的拉丁方,可以将每个拉丁方各自进行符号置换,使得它们的第一行都变为 0, 1, ... , n-1 。
任取其中两个拉丁方进行组合,第一行是 (0, 0), ... , (n-1, n-1) ,集齐了所有形如 (x, x) 的有序对,因此在其他位置不可能再出现这样的有序对,即两个拉丁方在其他位置不能取相等的值;特别地,两个拉丁方在第二行第一列的值不等。另外,所有拉丁方在第二行第一列的值都不是 0(否则与第一行第一列的 0 冲突了),只能在 1, ... , n-1 中取值。这样就说明最多只能有 n-1 个两两正交的拉丁方。
对 n 是素数 p 的情况,上界 n-1 是可以取到的。如下定义拉丁方 A_k :
A_k[i][j] = (k*i + j) mod p
其中 k=1, ... , p-1 ,下标 i, j 范围均为 [0, n) 。利用同余的性质,容易验证 A_k 都是拉丁方且两两正交。
对 n=2^k 的情况,似乎模 n 的方法不管用了。但我们还有一样利器:有限域。上面的模 p 加法和乘法运算实际上就是在有限域 F_p 中做加法和乘法,同样可以推广到有限域 F_2^k 上,此时 k 遍历域中所有非零元素,i, j 遍历域中所有元素,以上所有定义和证明依然成立。最后如果有必要的话,把域中元素的符号改写为 0, 1, ... , n-1 就行了。
因为所有 p^k 阶有限域均存在(p 是素数,k 是正整数),故当 n=p^k 时都存在 n-1 个两两正交的 n 阶拉丁方。
2016-02
用代数方法解决组合问题的经典实例。
我们知道每个超平面都对应方程 Sum( a_i*x_i | i=1..n) + b = 0 。如果超平面不过原点,说明 b 不为零,将方程两边同除以 b 进行归一化,常数项将变为 1 。因此后面均假设常数项为 1 。
下一步求这些超平面的并集,这只需将所有方程的左边相乘就可以得到。结果一定形如 P(x_1, ... , x_n)=0 ,其中 P 是一个 k 次 n 元多项式(k 为超平面的个数),对应的曲面经过除原点外所有 2^n-1 个点但不过原点。
注意当 x=0 或 1 时,都有 x^t=x(t 为正整数)。如果只关心多项式 P 在单位超立方体顶点上的取值,将 P 中所有形如 (x_i)^t 的部分全部简化为 x_i 不会产生任何影响。简化后的方程形如 Q(x_1, ... , x_n)=0 ,其中 Q 是次数不超过 k 的 n 元多项式,且每一项都是若干个不同的 x_i 相乘再乘以常系数的形式,项数不超过 2^n 。
例如当 n=2 时,Q 必有 Axy + Bx + Cy + D 的形式。
别忘了 Q 的常数项一定为 1(多项式 P 是若干个常数项为 1 的多项式乘积,常数项仍为 1;P 简化到 Q 的过程不改变常数项),代入 2^n-1 个点的坐标,很容易看出所有系数是唯一确定的。
什么?你说不容易看出?下面先举 n=3 的例子:
Q(x, y, z) = Axyz + Bxy + Cxz + Dyz + Ex + Fy + Gz + H
首先有 H=1;
分别代入 (1, 0, 0), (0, 1, 0), (0, 0, 1),可得 E=F=G=-1;
分别代入 (1, 1, 0), (1, 0, 1), (0, 1, 1) ,可得 B=C=D=1;
代入 (1, 1, 1),可得 A=-1。
对其他的 n 也一样,先代入恰有一个坐标分量为 1 的点,再代入恰有两个坐标分量为 1 的点,依次平推过去,所有系数都可以确定。
显然能看出这些系数不是 1 就是 -1,好像有什么规律,实际上这个唯一的 Q 就是:
Q(x_1, ... , x_n) = (1-x_1)(1-x_2)...(1-x_n)
现在可以看出 Q 是 n 次多项式,因此 P 也至少是 n 次多项式,从而至少也要用 n 个超平面才能满足题目要求。
找到满足条件的 n 个超平面并不难,x_1=1, x_2=1, ... , x_n=1 就可以了。
2016-03
题解的前半部分依然要参照这里的 2015-12 题解。但是在最后一步,我们调整一下配凑的系数:
6/10*#(L_2) + 3/10*#(K_(2,3)) + 1/10*#(T+) = Sum( (i^2-i+12)/20 * X_i )
请注意式子左边各系数之和等于 1,因此它是图 G 最常见子图的出现次数的一个下界,二者相等的条件是 L_2, K_(2,3) 和 T+ 出现次数都一样,并且再没有其他出现次数更多的导出子图。
结合式子
#(C_4) = Sum( i*X_i/4 )
我们希望比值 (i/4) / ((i^2-i+12)/20) 尽可能大。注意 i 限制为非负数,用高中数学知识可以求出 i=sqrt(12) 时取最大值;再考虑到 i 是整数,可得 i=3, 4 时该比值同时取到最大值 5/6 。
这说明二式比一式的比值不大于 5/6(取等号当且仅当仅 X_3 与 X_4 可以不为零,其余 X_i 均为零;即对 G 的任意同构于 L_2 的导出子图,恰有 3 或 4 种方法可以添一顶点变为 C_4),从而 #(C_4) 与最常见子图出现次数的比值不大于 5/6 。
满足除 X_3 与 X_4 外其余 X_i 不为零的图是存在的,例如 C_3*C_4, K_(4,4) 和 K_(5,5) 。C_3*C_4 是 C_3 和 C_4“相乘”得到的 12 顶图,考虑一个左右边卷曲相连,上下边卷曲相连的 3*4 棋盘,将所有相邻(有一条公共边)和相接(有一个公共顶点)的格子对连接,就得到 C_3*C_4 。
如果不理解什么是卷曲,只要记住“一三行格子之间不连,二四行格子之间不连,其余所有格子对都相连”即可。
上图是 C_3*C_4,注意并没有把 12 个顶点按 3*4 棋盘摆放,而是将棋盘的 4 行平移到同一行首尾相接,将 12 个格子串成一条直线,再弯成一个圆就得到上图。
(简单说明一下为什么这三个图满足条件。C_3*C_4 的导出子图为 C_4 只有一种情况,就是选取的 4 个顶点分别位于棋盘的一二三四行。随意去掉其中一个顶点,可以看出只有添入同一行的任意一个顶点才能获得 C_4 ,这样的顶点有 3 个,因此只有 X_3 不等于 0 。从 K_(4,4) 中选取 L_2(不妨设选了两个 X 部顶点,一个 Y 部顶点),必须添入另一个 Y 部顶点才能获得 C_4 ,这样的顶点有 3 个,因此只有 X_3 不等于 0 。K_(5,5) 的情况完全类似,只有 X_4 不等于 0 。)
遗憾的是,这三个图都不满足“L_2, K_(2,3) 和 T+ 出现次数都一样”的条件。它们具体的出现次数如下表:
L_2 | K_(2,3) | T+ | |
C_3*C_4 | 108 | 0 | 324 |
K_(4,4) | 48 | 48 | 0 |
K_(5,5) | 100 | 200 | 0 |
接下来就是最精髓的一步了:我们把若干个图放在一起,合成一个不连通图!别忘了,虽然之前说过 G 的最常见子图一定是从连通图里找,但是 G 本身未必就一定是连通图。而连通图 H 在不连通图中的出现次数,自然就是 H 在各个连通分量中的出现次数之和。
具体的系数不难通过配凑得出:只要把 100 个 C_3*C_4 ,225 个 K_(4,4) 和 108 个 K(5,5) 放在一起,新图中 L_2, K_(2,3) 和 T+ 的出现次数就都一样了。具体地说,它们都出现了 32400 次。
至此先不要高兴得太早,万一还有出现次数更多的图,这个构造就失败了。首先考虑非二分图的出现次数,显然它不可能在 K_(4,4) 和 K_(5,5) 中出现,只能在 C_3*C_4 中出现,即只要出现次数不超过 324(T+ 的出现次数)就暂时没问题了。根据 C_3*C_4 的结构进行分类讨论,可以找到除 T+ 外两个同样出现了 324 次的图:
好在没有超过 324 次的图。
接下来只需考虑在 K_(4,4) 或 K_(5,5) 中出现过的图,这两个图的导出子图一定是完全二分图。请注意,C_3*C_4 的连通导出子图中二分图少得可怜(只要在相邻两行取至少 3 个顶点,就形成一个三角形),仅有 K_(1,1),K_(1,2) 和 K_(2,2) 三种。K_(1,1) 即两点一线图,它出现的次数即为边的总数:
100*48+225*16+108*25=11100
显然比 32400 少得多,而 K_(1,2) 和 K_(2,2) 实际上就是 L_2 和 C_4,无需考虑。最后只剩下那些没在 C_3*C_4 中出现的图。K_(5,5) 的导出子图中,K_(2,3) 出现了 200 次,遥遥领先第二名(K_(2,2), (3,3), (1,2), (1,3), (2,4), (3,4) 等一系列完全二分图并列第二,各出现 100 次),而 K_(4,4) 的导出子图中 K_(2,3) 与 K_(1,2) 并列第一,出现了 48 次。也就是说,K_(2,3) 完全压制其他所有完全二分图。
综上,我们终于可以下结论说这个图满足题目要求了。此图的最常见子图为 L_2, K_(2,3), T+, 一个 6 顶图和一个 7 顶图,它们各出现 32400 次,而 C_4 出现了 27000 次,恰好是最常见子图出现次数的 5/6 倍。
2016-04
以下协议最坏情况下需传输 log(log(N))+O(1) 位即可达到目的(回忆算法复杂度理论中常用的符号:log 是以 2 为底的对数,O(1) 表示有界函数):Alice 将手中两个数转化为二进制,它们必然在某些位上不同,将这些位中最右侧一位的序号(按从右往左的顺序编号为第 0 位,第 1 位,...)告诉 Bob,Bob 将自己手中相应位告诉 Alice 即可。
例如 Alice 手中有 2 和 10,Bob 手中有 10,首先 Alice 将两个数转为二进制(10 和 1010),发现右数第 3 位不同,于是发送 “11”(3 的二进制表示);Bob 读出手中数 10 的二进制第 3 位是 1,于是回复“1”,Alice 就知道 Bob 拿的是 10 了。
因为 [1, N] 中所有整数的位数不超过 log(N),Alice 传给 Bob 的位序号自然也不会超过 log(N),传输过程最多消耗 log(log(N)) 位,加上 Bob 回传的一位以及 log(log(N)) 中隐含的常数项,最多需传输 log(log(N))+O(1) 位。
为了证明这个传输位数不能再优化,UyHiP 的官方题解用了一种很有启发性的叙述方式。假设游戏过程中 Alice 和 Bob 不发送任何字节,而让一个能同时看到 Alice, Bob 两人手中数字的中间人 Eve 代替两人进行广播(Alice 和 Bob 都能听见)。Alice, Bob 和 Eve 事先可以商量一个通讯协议。也许有人会说这样太简单了,Eve 看 Bob 拿的是大数还是小数,发送一个二进制位不就行了。现在加一个条件:Eve 在游戏中可能会随便乱发消息,要求当 Eve 违背事先商定的协议时,Alice 和 Bob 至少有一人必须立刻发现错误。
可以看出,任何原先的 Alice-Bob 两人协议都可以移植成现在这个游戏的三人协议。原游戏中是 Alice 和 Bob 对话,在新游戏中 Alice 和 Bob 可以让 Eve 逐句模仿原游戏中的对话,如果 Eve 模仿 Alice 的某句话出错,Alice 立刻就能发现;对 Bob 也同理。还用上面的例子举例,Eve 必须模仿两人对话,即先发送“11”再发送“1”。如果第一句错,Alice 立刻就能发现(因为跟自己想发的 11 不一样);如果第二句错,Bob 立刻就能发现(因为收到“11”的 Bob 想发送 1,但 Eve 说的跟自己想发的不一样)。也就是说,三人协议最坏传输的位数一定不超过两人协议最坏传输的位数。
接下来是证明的关键部分,以 (a, b) 表示“Alice 拿到数字 a 和 b,Bob 拿到数字 b”的情况。
对情况 (x, y) 和 (y, z) ,Eve 发送的消息序列不可能完全相同。否则在情况 (z, y) 中,Eve 可以假装是情况 (x, y) 或者 (y, z) 发送消息,这样拿到数字 y 和 z 的 Alice 会认为 Bob 拿到的是 z(即情况 (y, z)),而手中有 y 的 Bob 会认为 Alice 拿到的是 x 和 y(即情况 (x, y)),双方都不会发现 Eve 作假,并做出错误的判断。
有了这个结论,就可以将原问题转化成图论问题。以 [1, N] 中所有整数为顶点,每两个顶点之间连正反两条有向边,得到一个含 N(N-1) 条边的有向图(即有向完全图)。边 x->y 代表情况 (x, y) 。给图中所有边染色,如果两种情况下 Eve 发送的消息序列相同,则对应的两条边染相同颜色,否则染不同颜色。这样问题就变成了:用尽可能少的颜色给图中所有边染色,使得任何首尾连接的两条边颜色均不同。
注意到对任意两个顶点 x, y,边 x->y 的颜色与顶点 y 的任一条出边颜色均不同。记 S(x) 为 x 的所有出边颜色之集,则 S(x) 中有不属于 S(y) 的颜色,从而 S(x) 不等于 S(y) 。因此所有 N 个顶点的 S(.) 集一定两两不同。但 k 种颜色的子集只有 2^k 个,故 2^k>=N,即 k 最小也不会小于 log(N) 。
颜色数不小于 log(N),即 Eve 发送的消息序列至少有 log(N) 种不同形式,这说明 Eve 最坏情况下一定要发送长度至少为 log(log(N)) 的二进制序列,而两人协议传输的位数不会小于这个数。这说明 log(log(N))+O(1) 的传输位数的确不能再优化了。