下面是零音在第五届 AGMC 数学竞赛的二试部分的参赛解答。这是零音向主办方提交的答案,并非主办方给出的官方答案,零音的做法与官方答案有很大的不同,在部分题目的处理上似乎更加灵活(当然可能失了一部分严谨性),请读者带着谨慎的心态阅读,因为零音也不知道自己写的对不对。(

Problem 11

被 6363 绝对整除的最小正整数

一个正整数可以被 6363 绝对整除,等价于该正整数的任意排列可以被 99 和 77 整除。其中被 99 整除仅取决于数位和,即所有数字的和都是 99 的倍数;但被 77 整除则依赖于排列。

考虑正整数 mm 可被 77 绝对整除,即我们任意调换 mm 中的两个相邻的数位,得到的数应当依然能被 77 整除。对于不相邻的数位,可以视为若干次相邻数位的连续调换。我们假设 mm 的一个排列 …ab…\dots a b \dots 经过调换后变成了 …ba…\dots b a \dots,于是两个数的差为

9×(a−b)×10k9 \times (a-b) \times 10^k

须有

9×(a−b)×10k≡0(mod7)9 \times (a-b) \times 10^k \equiv 0 \pmod{7}

因为 gcd⁡(9×10k,7)=1\gcd(9 \times 10^k, 7) = 1,所以必然有 a−b≡0(mod7)a-b \equiv 0 \pmod{7}。遍历 a,b∈{1,2,…,9}a, b \in \{1, 2, \dots, 9\},从而只有 a=ba=b 或 {a,b}={1,8},{2,9}\{a,b\} = \{1,8\}, \{2,9\} 时条件满足。这就是说,mm 的所有数字除以 77 的余数必须完全相同。

编写 C++ 脚本枚举得到

111888.\boxed{111888.}

枚举最小正整数的 C++ 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
using namespace std;

int main() {
auto repunit_mod7 = 0; // repunit(k) mod 7
for (int k = 1; ; ++k) {
repunit_mod7 = (repunit_mod7 * 10 + 1) % 7;
string best = "";

for (int r = 0; r <= 6; ++r) {
// For absolute divisibility by 7, all digits must be congruent mod 7.
// r=0 => only digit 7 (0 not allowed). r=1,2 have two digits: r and r+7.
int d1 = (r == 0) ? 7 : r;
int d2 = (r == 1 || r == 2) ? r + 7 : -1;

// Condition for divisibility by 7: either r==0 or repunit(k)≡0 (mod 7).
if (r != 0 && repunit_mod7 != 0) continue;

string candidate;
if (d2 == -1) {
if ((d1 * k) % 9 != 0) continue;
candidate.assign(k, char('0' + d1));
} else {
// sum = k*d1 + 7*t, where t is count of d2
int mod = (k * d1) % 9;
int t0 = (-4 * mod) % 9; // inverse of 7 mod 9 is 4
if (t0 < 0) t0 += 9;
int t = -1;
for (int x = t0; x <= k; x += 9) {
t = x;
break;
}
if (t == -1) continue;
candidate.assign(k - t, char('0' + d1));
candidate.append(t, char('0' + d2));
}

if (best.empty() || candidate.size() < best.size() ||
(candidate.size() == best.size() && candidate < best)) {
best = candidate;
}
}

if (!best.empty()) {
cout << best << "\n";
return 0;
}
}
}

可绝对整除的正整数 nn

假设存在符合条件的,不含 00 的正整数 mm,使得 mm 的任意排列都是 nn 的倍数。显然 nn 不能是 1010 的倍数,因为 mm 的各数位不能为 00。下面我们对 mm 分两种情况考虑。

必要性

首先考虑这样的 mm,它有至少 2 个相异的数字 xx 和 yy。我们构造这样两个排列 N1=…xyN_1 = \dots x y、N2=…yxN_2 = \dots y x,即它们仅在最后两个数位上对调,从而因为有 n∣N1n \mid N_1 和 n∣N2n \mid N_2,则必须有 nn 整除它们的差:

N1−N2=10x+y−(10y+x)=9(x−y)N_1 - N_2 = 10x + y - (10y + x) = 9(x-y)

因为 x,y∈{1,…,9}x, y \in \{1, \dots, 9\},从而 x−yx-y 的绝对值最大为 88。注意到 nn 不能为 1616 和 2525 的倍数,因为 9(x−y)9(x-y) 不可能被 1616 和 2525 整除。

其次考虑 m=ddd…d=111…1×dm = d d d \dots d = 111 \dots 1 \times d,其中 1≤d≤91 \le d \le 9,即 mm 是一个纯数字数。因为 111…1111 \dots 1 本身是奇数,它不含有素因子 22 和 55,从而 mm 中的素因子 22 和 55,如果有,都应当是 dd 贡献的。最大情况下,d=8=23d = 8 = 2^3 和 d=5=51d = 5 = 5^1,从而 mm 中的素因子 22 和 55 亦不能整除 1616 和 2525。

综上我们证明了,符合条件的 nn 不能是 10,16,2510, 16, 25 的倍数。从而我们证明了必要性。

充分性

仅考虑纯数字数的 mm。下面我们证明:所有不是 10,16,2510, 16, 25 倍数的 nn 都存在被它整除的不含 00 的纯数字数 mm。

设 n=2a⋅5b⋅wn = 2^a \cdot 5^b \cdot w 其中 gcd⁡(w,10)=1\gcd(w, 10) = 1。由于 nn 不是 1010 的倍数,从而 a,ba, b 不能同时 >0> 0。由必要性,又有 a≤3a \le 3 和 b≤1b \le 1。

由 Euler 定理,因为 gcd⁡(9w,10)=1\gcd(9w, 10) = 1 从而必存在 k=φ(9w)k = \varphi(9w) 使得

10k≡1(mod9w)⇒w∣10k−1910^k \equiv 1 \pmod{9w} \Rightarrow w \mid \frac{10^k - 1}{9}

而 10k−19=111…1\frac{10^k - 1}{9} = 111 \dots 1(含 kk 个 11)。

  • 倘若 nn 含有 55,此时 a=0,b≤1a = 0, b \le 1,则 n=5wn = 5w 或 n=wn = w。选取 d=5d = 5 从而 m=5×111…1m = 5 \times 111 \dots 1,从而 w∣111…1w \mid 111 \dots 1,又因 5∣55 \mid 5,从而 n∣mn \mid m。
  • 倘若 nn 不含 55,此时 b=0,a≤3b = 0, a \le 3,所以 n=2a⋅wn = 2^a \cdot w。选取 d=2ad = 2^a,由 a≤3a \le 3 保证了 d∈{1,2,4,8}d \in \{1, 2, 4, 8\} 在 1∼91 \sim 9 内。设 m=2a×111…1m = 2^a \times 111 \dots 1,此时 w∣111…1w \mid 111 \dots 1 和 2a∣d2^a \mid d,从而 n∣mn \mid m。

这些纯数字数的所有排列均相同,从而若它们被 nn 整除,则它们被 nn 绝对整除。从而我们证明了充分性。

所有不被 10,16,2510, 16, 25 中任何一个数整除的正整数 nn 均符合条件。

Problem 13

确定期望的最小值

设 U=X−Y,V=Y−Z,W=Z−XU = X - Y, V = Y - Z, W = Z - X,则 U+V+W=0U + V + W = 0。从而

E(U2+V2+W2)=E[(X−Y)2+(Y−Z)2+(Z−X)2]=2E[X2+Y2+Z2]−2E[XY+YZ+ZX].\mathbb{E}(U^2 + V^2 + W^2) = \mathbb{E}[(X-Y)^2 + (Y-Z)^2 + (Z-X)^2] = 2\mathbb{E}[X^2 + Y^2 + Z^2] - 2\mathbb{E}[XY + YZ + ZX].

又 V[X]=E[X2]−(E[X])2=1\mathbb{V}[X] = \mathbb{E}[X^2] - (\mathbb{E}[X])^2 = 1 且 E[X]=0\mathbb{E}[X] = 0,应用于 X,Y,ZX, Y, Z 即得

E[X2]=E[Y2]=E[Z2]=1.\mathbb{E}[X^2] = \mathbb{E}[Y^2] = \mathbb{E}[Z^2] = 1.

又因为交叉项的期望均为 00,从而

E[U2+V2+W2]=2(1+1+1)−0=6.\mathbb{E}[U^2 + V^2 + W^2] = 2(1+1+1) - 0 = 6.

从而我们要求 E(U2n+V2n+W2n)\mathbb{E}(U^{2n} + V^{2n} + W^{2n}) 的最小值,当 E[U2+V2+W2]=6\mathbb{E}[U^2 + V^2 + W^2] = 6 时。这即在条件 u+v+w=0u + v + w = 0 且 u2+v2+w2=Qu^2 + v^2 + w^2 = Q(固定)下考察 u2n+v2n+w2nu^{2n} + v^{2n} + w^{2n}(n≥1n \ge 1)的最小值。略去证明过程,有 u2n+v2n+w2n≥Qn2n−1u^{2n} + v^{2n} + w^{2n} \ge \frac{Q^n}{2^{n-1}}。从而

E[U2n+V2n+W2n]≥2(E[Q/2])n=2⋅3n.\mathbb{E}[U^{2n} + V^{2n} + W^{2n}] \ge 2(\mathbb{E}[Q/2])^n = 2 \cdot 3^n.

分析期望的最大值

该期望应当是存在上限但可以任意大的。

设定 X,Y,ZX, Y, Z 之间相互独立且同分布。为了使 (X−Y)2n(X - Y)^{2n} 变得非常大,我们可以让 X,Y,ZX, Y, Z 有很小的概率取一个极大的正值,以很大的概率取一个较小的负值。这即,设常数 p∈(0,1)p \in (0, 1) 是一个非常小的概率,令 XX 以概率 pp 取正值 MM,以概率 1−p1 - p 取负值 −a-a,并保证有期望符合题意

E[X]=pM−(1−p)a=0⇒a=pM1−p\mathbb{E}[X] = pM - (1-p)a = 0 \Rightarrow a = \frac{pM}{1-p}

对于方差,由于期望为 00,即要求 E[X2]=1\mathbb{E}[X^2] = 1,从而

E[X2]=pM2+(1−p)a2=1\mathbb{E}[X^2] = pM^2 + (1-p) a^2 = 1

将 aa 代入上式,化简得

pM21−p=1\frac{pM^2}{1-p} = 1

从而有

M=1−pp,−a=−p1−p.M = \sqrt{\frac{1-p}{p}}, \quad -a = -\sqrt{\frac{p}{1-p}}.

对 X,Y,ZX, Y, Z 的处理类似。由于它们的期望均为 00,从而交叉乘积期望也为 00,待求的目标期望是

Eobj=E[(X−Y)2n+(Y−Z)2n+(Z−X)2n].\mathbb{E}_{\text{obj}} = \mathbb{E}[(X - Y)^{2n} + (Y - Z)^{2n} + (Z - X)^{2n}].

在 Eobj\mathbb{E}_{\text{obj}} 中仅保留情况 (X−Y)2n(X - Y)^{2n} 以放缩其下界,具体地,令

E[(X−Y)2n]≥P(X=M,Y=−a)⋅(M−(−a))2n=p(1−p)(M+a)2n>p(1−p)M2n=p(1−p)(1−pp)n=p1−n(1−p)n+1.\begin{aligned} \mathbb{E}[(X-Y)^{2n}] &\ge \mathbb{P}(X = M, Y = -a) \cdot (M - (-a))^{2n} \\\\ &= p(1-p)(M+a)^{2n} > p(1-p)M^{2n} \\\\ &= p(1-p)\left(\frac{1-p}{p}\right)^n \\\\ &= p^{1-n}(1-p)^{n+1}. \end{aligned}

当 n≥2n \ge 2 时 p1−n=1pn−1p^{1-n} = \frac{1}{p^{n-1}},而 p→0+p \to 0^+ 时 (1−p)n+1→1(1 - p)^{n + 1} \to 1 且 1pn−1→+∞\frac{1}{p^{n-1}} \to +\infty,从而 E[… ]\mathbb{E}[\dots] 可以变得无限大。(n=1n = 1 时,目标期望趋于 66,这是因为方差固定条件。)

综上

E[… ]∈[2⋅3n,+∞).\boxed{\mathbb{E}[\dots] \in [2 \cdot 3^n, +\infty).}

Problem 14

下界

给出下界的构造:对方格表中的任意格子 (x,y)(x, y),当且仅当 x+y≡0(mod3)x + y \equiv 0 \pmod{3} 时填入 V,否则填入 E。

取某一个不位于边缘的 V,以它为中心,横着和竖着读均可以读到 EEVEE。位于 (x,y)(x, y) 的 V 的主对角线方向上,与它相距为 ±1\pm 1 和 ±2\pm 2 的坐标的和与它本身的坐标的和(即 x+yx + y)的差为 ±2\pm 2 或 ±4\pm 4,模 33 均不为 00,从而这些格子上均为 E,又构成了 EEVEE。副对角线上因为格子的坐标和为常量,对应字母均为 V,故无法形成 EEVEE。

在这样的构造下,V 的分布密度为 1/31/3,即总共有 n23+O(n)\frac{n^2}{3} + O(n) 个 V。每一个 V 可以读出 33 个单词,从而整个方格表中可以读出的单词数量为

3×(13n2+O(n))=n2+O(n).3 \times \left(\frac{1}{3} n^2 + O(n)\right) = n^2 + O(n).

因此,单词数量的下界

f(x)≥n2+O(n).\boxed{f(x) \ge n^2 + O(n).}

上界

我们要证明单词不可能过度密集。将 n×nn \times n 的整个方格划分为若干个互不重叠的 3×33 \times 3 的小正方形区块,这样的区块大约有 n29\frac{n^2}{9} 个。取其中一个区块 AA,考察中心点(这里指 EEVEE 中的 V)落在区块 AA 内部的全体 EEVEE 单词的最大数量 W(A)W(A)。

考虑 3×33 \times 3 的区域 AA。

  • 假使这个单词是横向排布的。若单词的中心落在了区域 AA 中某行的某个格子中,为了确保单词 EEVEE 的排布,V 的左右两侧两个格子都必须是 E。也就是说,在 AA 的某一行中,只要该行存在一个 V,那么该行剩下的格子就必须是 E。
  • 纵向排布的单词同理。
  • AA 内部的对角线(主对角线和副对角线)各有 55 条,长度分别为 1,2,3,2,11, 2, 3, 2, 1,任何一条对角线位于区域 AA 内部的距离的最大值为 22。从而,对于一个斜向排布的单词,若单词的中心落在了区域 AA,则其对应方向的整条对角线的位于区域内部的格子也不能出现 V。

从而:位于区域 AA 内的横向排布的单词的数量,应当小于等于区域 AA 内部的恰好只有 1 个 V 的行的数量;位于区域 AA 内的纵向排布的单词的数量,应当小于等于区域 AA 内部的恰好只有 1 个 V 的列的数量;位于区域 AA 内的某个方向上的所有对角线上的单词的数量,应当小于等于区域 AA 内该方向上恰好只有 1 个 V 的对角线的数量。

现在,我们假设在区域 AA 的 9 个格子中填入了 vv 个 V。由上可知:中心落在区域 AA 内的 EEVEE 单词的数量,小于等于区域 AA 内部的恰好只有 1 个 V 的行的数量、区域 AA 内部的恰好只有 1 个 V 的列的数量、和区域 AA 内两个对角线方向上恰好只有 1 个 V 的对角线的数量的总和。对 vv 进行枚举:首先考虑 v=0v = 0 和 v=1v = 1 和 v=2v = 2 的情况,前两者分别最多激活 00 和 44 条线,后者通过非对角的错位排布可以激活 88 条线。但对于 v≥3v \ge 3 的情况,因为可能会导致单词的重叠,手动统计是痛苦的。我们编写 C++ 脚本,可以统计得到最大的可能性是 11 个单词。但不可能在每一个这样的区域都取到最大值。所以……

(艹怎么证不出来了 o(TヘTo) 已放弃。好难啊)

赛后补充:这是什么个事呢,如果零音枚举完发现最大的可能性是 1010 个单词,那题目的上界就非常松了,零音的上界直接可以够到得分最高档。只可惜最大值是 1111,当然,我们所有人都知道不可能每一个区域都取到这个最大值,但这是无法说明的,零音这个上界只能得 45 分中的至多 15 分,哭泣中😭

枚举单词数量最大可能性的 C++ 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <bits/stdc++.h>
using namespace std;

int main() {
int best = 0;
int bestMask = 0;

auto check = [&](int mask) {
int a[3][3] = {};
for (int i = 0; i < 9; ++i) {
a[i/3][i%3] = (mask >> i) & 1;
}

set<int> counted;

int cnt = 0;
for (int r = 0; r < 3; ++r) for (int c = 0; c < 3; ++c) {
if (!a[r][c]) continue;

int sumRow = a[r][0] + a[r][1] + a[r][2];
if (sumRow == 1 && !counted.count(r)) {
counted.insert(r);
cnt++;
}

int sumCol = a[0][c] + a[1][c] + a[2][c];
if (sumCol == 1 && !counted.count(3 + c)) {
counted.insert(3 + c);
cnt++;
}

int d = r - c; // -2..2
int sumDiag = 0;
for (int i = 0; i < 3; ++i) {
int j = i - d;
if (0 <= j && j < 3) sumDiag += a[i][j];
}
int idDiag = 6 + (d + 2); // 6..10
if (sumDiag == 1 && !counted.count(idDiag)) {
counted.insert(idDiag);
cnt++;
}

int s = r + c; // 0..4
int sumAnti = 0;
for (int i = 0; i < 3; ++i) {
int j = s - i;
if (0 <= j && j < 3) sumAnti += a[i][j];
}
int idAnti = 11 + s; // 11..15
if (sumAnti == 1 && !counted.count(idAnti)) {
counted.insert(idAnti);
cnt++;
}
}

return cnt;
};

for (int mask = 0; mask < (1<<9); ++mask) {
int val = check(mask);
if (val > best) {
best = val;
bestMask = mask;
}
}

cout << best << "\n";
// Print one example achieving the maximum
for (int r = 0; r < 3; ++r) {
for (int c = 0; c < 3; ++c) {
int bit = (bestMask >> (r * 3 + c)) & 1;
cout << bit << (c == 2 ? '\n' : ' ');
}
}
return 0;
}