Type to search.

ICPC Regional Hanoi 2024 · Part 3 of 4

Length: 2284 wordsReading time: 13 min read

ICPC Regional Hanoi 2024 Editorial - Z

Published:


Lời giải hai bài rất khó I và E trong đề.

I: Inversland 

Đề bài

Cho nn mệnh giá tiền, mệnh giá tiền thứ ii là 1pi\frac{1}{p_{i}} với pip_i là số nguyên tố. Đếm số lượng giá trị hữu tỉ có thể trả được bằng các mệnh giá tiền này mà người bán bắt buộc phải trả lại tiền thừa, modulo 998244353998244353.

Lời giải

Ta phát biểu lại bài toán từ các mệnh giá hữu tỉ về các mệnh giá nguyên mà không mất tính tổng quát: Gọi PP là tích của tất cả các pip_i. Nhân mọi mệnh giá với PP thì mệnh giá thứ ii trở thành số nguyên ai=P/pia_i=P/p_i. Trong bối cảnh bài toán này ta nói một số tiền xx nguyên là biểu diễn được nếu nó có thể biểu diễn bằng tổ hợp tuyến tính hệ số không âm của các giá trị aia_{i}, tức là x=∑i=1nciaix=\sum_{i=1}^{n}c_{i}a_{i} với ci≥0c_{i}\ge0. Đáp án là số lượng giá trị không biểu diễn được.

Trước tiên ta phát biểu một số kết quả toán học cần thiết để chứng minh lời giải của bài toán này:

Định lý Bezout cho nn số

Phát biểu:

Với mọi tập gồm nn số nguyên a1,a2,…,ana_1, a_2, \dots, a_n (n≥2n \ge 2), luôn tồn tại bộ số nguyên x1,x2,…,xnx_1, x_2, \dots, x_n sao cho: 

∑i=1naixi=gcd⁡(a1,a2,…,an)\sum_{i=1}^n a_i x_i = \gcd(a_1, a_2, \dots, a_n)

Chứng minh:

Ta chứng minh bằng quy nạp. Trường hợp cơ sở với n=2n=2 là bổ đề Bezout[2] đã được chứng minh. 

Giả sử định lý đúng với k≥2k \ge 2. Nghĩa là với mọi bộ kk số nguyên a1,a2,…,aka_1, a_2, \dots, a_k, đặt dk=gcd⁡(a1,a2,…,ak)d_k = \gcd(a_1, a_2, \dots, a_k), luôn tồn tại bộ số nguyên x1,x2,…,xkx_1, x_2, \dots, x_k thỏa mãn: a1x1+a2x2+⋯+akxk=dka_1 x_1 + a_2 x_2 + \dots + a_k x_k = d_k. Ta chứng minh mệnh đề đúng với k+1k+1.

Theo tính chất kết hợp của hàm gcd ta có 

gcd⁡(a1,a2,…,ak,ak+1)=gcd⁡(gcd⁡(a1,a2,…,ak),  ak+1)=gcd⁡(dk,ak+1)\gcd(a_1, a_2, \dots, a_k, a_{k+1}) = \gcd\Big(\gcd(a_1, a_2, \dots, a_k), \; a_{k+1}\Big) = \gcd(d_k, a_{k+1})

Áp dụng Bổ đề Bézout cho 2 số dkd_k và ak+1a_{k+1}, tồn tại hai số nguyên u,vu, v sao cho: 

u⋅dk+v⋅ak+1=gcd⁡(dk,ak+1)u \cdot d_k + v \cdot a_{k+1} = \gcd(d_k, a_{k+1})

Thay dk=∑i=1kaixid_k = \sum_{i=1}^k a_i x_i từ giả thiết quy nạp vào phương trình trên:

u(∑i=1kaixi)+v⋅ak+1=gcd⁡(a1,a2,…,ak+1)u \left( \sum_{i=1}^k a_i x_i \right) + v \cdot a_{k+1} = \gcd(a_1, a_2, \dots, a_{k+1})

Khai triển và nhóm lại:

∑i=1kai(u⋅xi)+ak+1⋅v=gcd⁡(a1,a2,…,ak+1)\sum_{i=1}^k a_i (u \cdot x_i) + a_{k+1} \cdot v = \gcd(a_1, a_2, \dots, a_{k+1})

Vì u,vu, v và các xix_i đều là số nguyên, nên xi′=u⋅xix'_i = u \cdot x_i (với 1≤i≤k1 \le i \le k) và xk+1′=vx'_{k+1} = v cũng là các số nguyên. Do đó, ta đã biểu diễn được gcd⁡(a1,…,ak+1)\gcd(a_1, \dots, a_{k+1}) dưới dạng tổ hợp tuyến tính nguyên của k+1k+1 số a1,…,ak+1a_1, \dots, a_{k+1}. Theo nguyên lý quy nạp ta có điều phải chứng minh. 

Số Frobenius

Số Frobenius (ký hiệu F(a1,a2,…,an)F(a_1, a_2, \dots, a_n)) của một tập các số nguyên dương a1,a2,…,ana_1, a_2, \dots, a_n (với điều kiện gcd⁡(a1,a2,…,an)=1\gcd(a_1, a_2, \dots, a_n) = 1) là số nguyên lớn nhất không thể biểu diễn dưới dạng tổ hợp tuyến tính không âm của các số đó. Mô tả bằng công thức: FF là số nguyên lớn nhất sao cho phương trình:

c1a1+c2a2+⋯+cnan=Fc_1 a_1 + c_2 a_2 + \dots + c_n a_n = F

không có nghiệm nguyên không âm (ci∈Z≥0c_i \in \mathbb{Z}_{\ge 0}). Ngược lại, với mọi số nguyên m>Fm > F, phương trình c1a1+⋯+cnan=mc_1 a_1 + \dots + c_n a_n = m luôn có ít nhất một bộ nghiệm ci≥0c_i \ge 0.

Định lý Schur-Frobenius

Phát biểu: Cho nn số nguyên dương a1,a2,…,ana_1, a_2, \dots, a_n (n≥2n \ge 2) nguyên tố cùng nhau. Khi đó, tồn tại một ngưỡng số nguyên NN sao cho với mọi số nguyên m≥Nm \ge N, phương trình Diophantine:

c1a1+c2a2+⋯+cnan=mc_1 a_1 + c_2 a_2 + \dots + c_n a_n = m

luôn có ít nhất một bộ nghiệm nguyên không âm (c1,c2,…,cn∈Z≥0)(c_1, c_2, \dots, c_n \in \mathbb{Z}_{\ge 0}).

Chứng minh:

Vì gcd⁡(a1,a2,…,an)=1\gcd(a_1, a_2, \dots, a_n) = 1, theo Định lý Bézout, luôn tồn tại các số nguyên u1,u2,…,unu_1, u_2, \dots, u_n (có thể âm) sao cho 1=u1a1+u2a2+⋯+unan1 = u_1 a_1 + u_2 a_2 + \dots + u_n a_n. 

Xét một số dư rr bất kỳ trong tập {0,1,2,…,a1−1}\{0, 1, 2, \dots, a_1 - 1\}. Nhân cả 2 vế của phương trình trên với rr:

r=(r⋅u1)a1+(r⋅u2)a2+⋯+(r⋅un)anr = (r \cdot u_1) a_1 + (r \cdot u_2) a_2 + \dots + (r \cdot u_n) a_n

Lấy modulo hai vế cho a1a_1, ta thu được:

r≡(r⋅u2)a2+⋯+(r⋅un)an(moda1)r \equiv (r \cdot u_2) a_2 + \dots + (r \cdot u_n) a_n \pmod{a_1}

Các hệ số (r⋅ui)(r \cdot u_i) ở trên có thể bị âm. Nếu hệ số nào bị âm, ta chỉ cần cộng thêm vào hệ số đó một lượng k⋅a1k \cdot a_1 (chọn kk đủ lớn để hệ số trở thành số dương) mà không làm thay đổi số dư khi chia tổng trên cho a1a_1. Nhờ đó, với mỗi số dư rr, ta luôn tìm được một số Mr≥0M_r \ge 0 được tạo thành từ tổ hợp không âm của (a2,…,an)(a_2, \dots, a_n) sao cho Mr≡r(moda1)M_r \equiv r \pmod{a_1}. Với a1a_1 số dư khả dĩ (0,1,…,a1−1)\left(0,1,\dots,a_1-1\right), ta thu được a1a_1 giá trị {M0,M1,…,Ma1−1}\{M_0, M_1, \dots, M_{a_1-1}\}. 

Đặt N=max⁡(M0,M1,…,Ma1−1)N = \max(M_0, M_1, \dots, M_{a_1-1}). Lấy một số m≥Nm \ge N bất kỳ. Giả sử mm chia a1a_1 dư rr:

  1. Do mm và MrM_r có cùng số dư khi chia cho a1a_1, hiệu (m−Mr)(m - M_r) chia hết cho a1a_1.
  2. Do m≥N≥Mrm \ge N \ge M_r, ta có (m−Mr)≥0(m - M_r) \ge 0. Khi này ta có thể viết m=q⋅a1+Mrm = q \cdot a_1 + M_r (với q=m−Mra1≥0q = \frac{m - M_r}{a_1} \ge 0).
  3. Vì q≥0q \ge 0 và MrM_r vốn đã là tổ hợp không âm của (a2,…,an)(a_2, \dots, a_n), ta suy ra mm có thể biểu diễn được bằng tổ hợp không âm của (a1,a2,…,an)(a_1, a_2, \dots, a_n). ■\blacksquare

Không chỉ vậy, định lý này còn có một kết quả mạnh hơn. Bạn đọc có thể đọc ở đây: Schur's theorem - Wikipedia 

Quay trở lại bài toán. Từ định lý Schur-Frobenius ta suy ra một hệ quả trực tiếp là số các mệnh giá không biểu diễn được là hữu hạn, nên không có trường hợp in ra infinite.

Do các pip_i đôi một nguyên tố cùng nhau, theo Định lý Số dư Trung Hoa, tồn tại duy nhất bộ số (c1,c2,…,cn)(c_1, c_2, \dots, c_n) với 0≤ci≤pi−10 \le c_i \le p_i - 1 sao cho:

x≡∑i=1nciai(modP)x \equiv \sum_{i=1}^n c_i a_i \pmod P

Đặt v(c)=∑i=1nciaiv(\mathbf{c}) = \sum_{i=1}^n c_i a_i. Khi đó xx luôn viết được dưới dạng x=v(c)+kPx = v(\mathbf{c}) + k P với k∈Zk \in \mathbb{Z}. Ta có bổ đề sau: 

Bổ đề: Số xx là biểu diễn được  ⟺  k≥0\iff k\ge0 (tức x≥v(c)x \ge v(\mathbf{c})).

Chứng minh

Chiều thuận: 

Ta có x=v(c)+kP=(c1+kp1)a1+∑i=2nciaix = v(\mathbf{c}) + k P = (c_1 + k p_1) a_1 + \sum_{i=2}^n c_i a_i. Do k≥0k \ge 0, tất cả hệ số đều ≥0\ge 0

Chiều nghịch: 

Giả sử x=∑ci′aix = \sum c'_i a_i với ci′≥0c'_i \ge 0. Xét modulo pip_i, ta có ci′ai≡x≡ciai(modpi)  ⟹  ci′≡ci(modpi)c'_i a_i \equiv x \equiv c_i a_i \pmod{p_i} \implies c'_i \equiv c_i \pmod{p_i}. 

Do ci′≥0c'_i \ge 0 và 0≤ci≤pi−10 \le c_i \le p_i - 1, ta bắt buộc có ci′=ci+kipic'_i = c_i + k_i p_i với ki≥0k_i \ge 0.

Suy ra x=∑(ci+kipi)ai=v(c)+(∑ki)P  ⟹  k=∑ki≥0x = \sum (c_i + k_i p_i) a_i = v(\mathbf{c}) + \left(\sum k_i\right) P \implies k = \sum k_i \ge 0.

Từ bổ đề trên, một số xx là không biểu diễn được khi và chỉ khi:

x=v(c)−kPvới k≥1x = v(\mathbf{c}) - k P \quad \text{với } k \ge 1

Để tìm số không thể biểu diễn lớn nhất (số Frobenius FF):

  1. Chọn k=1k = 1 và chọn các cic_{i} sao cho v(c)=∑i=1nciaiv(\mathbf{c}) = \sum_{i=1}^n c_i a_i đạt giá trị lớn nhất, tức là chọn ci=pi−1c_i = p_i - 1 với mọi ii. Do đó: F=∑i=1n(pi−1)ai−PF = \sum_{i=1}^n (p_i - 1) a_i - P.
  2. Biến đổi đại số: 
∑i=1n(pi−1)ai=∑i=1n(piai−ai)=∑i=1n(P−ai)=nP−∑i=1nai=nP−S\sum_{i=1}^n (p_i - 1) a_i = \sum_{i=1}^n (p_i a_i - a_i) = \sum_{i=1}^n (P - a_i) = n P - \sum_{i=1}^n a_i = n P - S
  1. Thế vào công thức FF:
F=(nP−S)−P=(n−1)P−SF = (n P - S) - P = (n - 1)P - S

Từ công thức trên ta có thể chứng minh được FF luôn là một số lẻ (bạn đọc có thể tự chứng minh bằng cách xét trường hợp).

Xét một số nguyên x∈[0,F]x \in [0, F]. Ta ghép cặp xx với F−xF - x. Tập hợp [0,F][0, F] gồm đúng F+1F + 1 số nguyên, được chia thành F+12\frac{F + 1}{2} cặp {x,F−x}\{x, F - x\}. Ta chứng minh rằng trong mỗi cặp {x,F−x}\{x, F - x\} luôn có đúng một số biểu diễn được và một số không biểu diễn được.

Chứng minh

Ý 1: Không thể cả 2 số cùng biểu diễn được

Nếu cả xx và F−xF - x đều biểu diễn được, thì tổng của chúng là F=x+(F−x)F = x + (F - x) cũng phải biểu diễn được (tổng 2 tổ hợp tuyến tính không âm là tổ hợp tuyến tính không âm). Điều này mâu thuẫn với định nghĩa FF là số không biểu diễn được.

Ý 2: Không thể cả 2 số cùng không biểu diễn được

Không mất tính tổng quát, giả sử xx không biểu diễn được. Theo bổ đề, x=v(c)−kPx = v(\mathbf{c}) - k P với k≥1k \ge 1. Ta xét số F−xF-x:

F−x=(∑i=1n(pi−1)ai−P)−(∑i=1nciai−kP)F - x = \left( \sum_{i=1}^n (p_i - 1) a_i - P \right) - \left( \sum_{i=1}^n c_i a_i - k P \right)F−x=∑i=1n(pi−1−ci)ai+(k−1)PF - x = \sum_{i=1}^n (p_i - 1 - c_i) a_i + (k - 1) P

Đặt ci′=pi−1−cic'_i = p_i - 1 - c_i. Vì 0≤ci≤pi−10 \le c_i \le p_i - 1, ta có 0≤ci′≤pi−10 \le c'_i \le p_i - 1. Do k≥1  ⟹  k−1≥0k \ge 1 \implies k - 1 \ge 0, biểu thức trên chính là dạng v(c′)+k′Pv(\mathbf{c}') + k' P với k′=k−1≥0k' = k - 1 \ge 0. Theo bổ đề, F−xF - x biểu diễn được.

Tổng kết 2 ý ta suy ra trong hai số xx và F−xF-x phải có đúng 1 số biểu diễn được và 1 số không biểu diễn được, tức điều phải chứng minh.

Do 00 biểu diễn được (ci=0c_i = 0), các số không biểu diễn được đều nằm trong khoảng [1,F][1, F]. Mọi số >F> F đều biểu diễn được. Vậy tổng số lượng các số nguyên dương không biểu diễn được là:

g=F+12=(n−1)P−S+12g=\frac{F + 1}{2}=\frac{(n-1)P-S+1}{2}

Cài đặt. Vì pip_i có thể trùng với modulo 998244353998244353 nên ta không được dùng phép chia bằng nghịch đảo modulo. Thay vào đó, ta có thể tính nhanh được cả PP và SS bằng tích tiền tố nhân tích hậu tố của các số pp. Độ phức tạp cho mỗi test là O(n)\mathcal{O}(n). 

Code

C++
#include <iostream>
#include <vector>
using namespace std;
static constexpr int MOD = 998244353;
static constexpr long long INV2 = (MOD + 1) / 2; // Modular inverse of 2 mod MOD
void solve() {
int n;
cin >> n;
vector<long long> p(n);
for (int i = 0; i < n; ++i) {
cin >> p[i];
p[i] %= MOD;
}
// Compute suffix products in O(N): suff[i] = p[i] * p[i+1] * ... * p[n-1] % MOD
vector<long long> suff(n + 1, 1);
for (int i = n - 1; i >= 0; --i) {
suff[i] = (suff[i + 1] * p[i]) % MOD;
}
long long P = suff[0]; // Total product P = p[0] * ... * p[n-1] % MOD
long long S = 0;
long long pref = 1;
// Compute S = sum(P / p_i) = sum(pref[i] * suff[i+1]) in O(N)
for (int i = 0; i < n; ++i) {
long long term = (pref * suff[i + 1]) % MOD;
S = (S + term) % MOD;
pref = (pref * p[i]) % MOD;
}
// Frobenius number F = (n - 1) * P - S (mod MOD)
long long F = ((1LL * (n - 1) % MOD * P) - S) % MOD;
if (F < 0) F += MOD;
// Genus g = (F + 1) / 2 (mod MOD)
long long g = (F + 1) % MOD * INV2 % MOD;
cout << g << "\n";
}
int main() {
// Fast I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (cin >> T) {
while (T--) {
solve();
}
}
return 0;
}

E: Easy Game 

Đề bài

Bash và Chikapu chơi một trò chơi đối kháng trên một băng giấy gồm nn ô trống ban đầu. Hai người luân phiên đi. Tại mỗi lượt, chọn 1 ô trống và điền 1 ký tự thuộc xâu AA vào ô đó.

Người chơi giành chiến thắng ngay lập tức nếu nước đi của mình tạo ra xâu SS có độ dài mm liên tiếp trên bảng. Trò chơi kết thúc Hòa nếu điền hết nn ô mà xâu SS vẫn chưa xuất hiện. Biết rằng ss không chứa 3 chữ cái liên tiếp giống nhau.

Xác định kết quả của trò chơi (Bash thắng, Chikapu thắng, hay Hòa) khi cả hai đều chơi tối ưu.

Giới hạn: 1≤t≤1001 \le t \le 100 testcase; 1≤n≤1001 \le n \le 100; m=∣S∣≤100m=\vert{}S\vert{}\le100; ∣A∣≤26\vert{}A\vert{}\le26.

Lời giải

Đây là một bài chia trường hợp rất khó và không có đội nào AC trong kì thi. Lời giải dưới đây bổ sung dựa trên sketch ý tưởng của anh RR.

Ta bắt đầu với các nhận xét:

  1. Sau một nước đi của người X bất kì, nếu nó tạo ra trạng thái mà đối thủ có thể thắng luôn thì đó được gọi là “trạng thái chết”.
  2. Nếu một người luôn có nước đi không tạo ra trạng thái chết ("nước an toàn") thì người đó không bao giờ thua. Nên nếu cả hai đều có chiến thuật luôn đi được nước an toàn thì kết quả là hòa. Kết quả chỉ khác hoà khi có người bị ép phải tạo ra trạng thái chết.

Các trường hợp dễ

  1. Có kí tự của SS không thuộc AA: không bao giờ tạo được SS   ⟹  \implies hoà.
  2. m>nm>n: không đủ chỗ để tạo ra xâu SS   ⟹  \implies hòa.
  3. m=1m=1: Bash điền ngay chữ đó ở nước đầu   ⟹  \implies Bash.
  4. Có chữ thuộc AA mà không thuộc SS (m≥2)\left(m\ge2\right): chữ cái đó không khớp ô nào của SS, nên điền nó sẽ luôn an toàn   ⟹  \implieshòa.

Như vậy, ta chỉ còn các trường hợp mà tập các chữ cái của SS trùng với tập các chữ cái của AA và 2≤m≤n.2\le m\le n.

m=2m=2

Đây vẫn còn là trường hợp dễ khi ta chỉ cần xét:

  1. S∼aaS \sim aa (khi đó A={a}A=\left\lbrace a\right\rbrace): Bash điền aa vào ô bất kỳ, vì n≥2n\ge2 nên còn ô trống kề bên, Chikapu điền a vào đó và thắng  ⟹  \impliesChikapu.
  2. S∼abS \sim ab: nếu một người chơi đi bb vào bên phải của 1 ô trống hoặc aa vào bên trái của 1 ô trống sẽ thua luôn. Do đó cả hai sẽ chơi an toàn bằng việc điền bb vào bên trái ngoài cùng hoặc aa vào bên phải ngoài cùng  ⟹  \implies hòa.

m=3,S∼{abc,aab,baa}m=3,S\sim\left\lbrace abc,aab,baa\right\rbrace

Cả 3 trường hợp này đều ra kết quả hoà.

  1. S∼abcS \sim abc: ta có thể điền cc ở vị trí đầu tiên để trở thành người đi sau điền aa trước cc hoặc bb sau cc, điền cc sau aa hoặc bb trước aa, điền bb trước hoặc sau bb. Kết quả hoà.
  2. S∼aabS \sim aab hoặc S∼baaS \sim baa coi như là một trường hợp aabaab. Có một chiến thuật để chắc chắn hòa trở lên không phụ thuộc lượt đi là điền bb vào vị trí trống đầu tiên. Thật vậy vì 3 trạng thái chết có thể có là aa?,a?b,?abaa?,a?b,?ab nên từ một trạng thái chưa chết ta không thể tạo ra trạng thái chết nếu chơi với chiến thuật trên. Như vậy kết quả là hoà.

m=3m=3, S∼abaS \sim aba

Đây là lớp trường hợp then chốt và khó nhất của bài toán. Khi này ta định nghĩa “bẫy” là chuỗi có dạng a??aa??a trong đó ?? thể hiện 1 ô trống. Ta thấy rằng nếu trên bảng có bẫy, thì người chơi nào điền bất kỳ aa hoặc bb vào vị trí ?? của bẫy sẽ thua vì tạo ra trạng thái chết. Do đó khi tạo được bẫy thì người chơi tiếp theo sẽ chỉ có thể điền bên ngoài bẫy này. 2 người chơi sẽ cố gắng tránh bẫy này cho đến khi hết vị trí ở bên ngoài. 

Gọi FF là số ô trống nằm ngoài mọi bẫy ("ô tự do"). Ô tự do luôn có nước an toàn, còn ô trong bẫy thì không. Mỗi nước an toàn vào ô tự do làm FF giảm 1, và nếu nó tạo thêm bẫy mới (điền aa cách một chữ aa có sẵn đúng 3 ô, ở giữa là hai ô ??) thì FF sẽ giảm thêm 2 cho mỗi bẫy mới. Theo đó mỗi nước đi luôn làm FF giảm một lượng lẻ, nên tính chẵn lẻ của FF thay đổi sau mỗi nước đi. Không có cách nào giảm số bẫy đi, nên khi F=0F = 0 mà có bẫy thì người đến lượt sẽ luôn tạo ra trạng thái chết và thua ở lượt sau. 

Giả sử người XX vừa tạo bẫy lúc có ee ô trống (trước nước đi đó). Sau nước đó FF có cùng tính chẵn lẻ với e−1e - 1, đối thủ YY đến lượt, và cứ đến lượt YY thì FF lại có cùng tính chẵn lẻ ấy. YY gặp F=0F = 0 khi và chỉ khi e−1e - 1 chẵn, tức ee lẻ. Từ đó ta có kết luận là XX thắng nếu ee lẻ, XX thua nếu ee chẵn. Áp dụng vào đầu trò chơi: Bash đi mỗi lượt khi ee cùng tính chẵn lẻ với nn; Chikapu đi khi ee cùng tính chẵn lẻ với n−1n - 1. Do đó:

  1. nn lẻ: chỉ Bash được lợi khi tạo bẫy. Nếu bẫy xuất hiện thì Bash thắng; Chikapu sẽ không tự tạo bẫy. Nếu không có bẫy nào thì hòa.
  2. nn chẵn: ngược lại, chỉ Chikapu được lợi khi tạo bẫy. Nếu bẫy xuất hiện thì Chikapu thắng, nếu không thì hòa.

Từ nhận xét trên, ta có thể chứng minh được thêm khá nhiều trường hợp:

  1. Với n≤6n\le6 ta có thể duyệt để chứng minh là kết quả luôn hoà. 
  2. Với n=7n=7, Bash điền aa vào ô số 4 (chính giữa). Bất kể người chơi sau đi thế nào, Bash có thể tạo được bẫy bằng việc điền aa vào ô 1 hoặc 7. Với mọi n≥7n\ge7 lẻ thì có thể chứng minh Bash thắng tương tự vậy.
  3. Với nn chẵn Bash không thể thắng bằng chiến thuật này do khi tạo được bẫy thì Bash luôn thua do tính chẵn lẻ của nn. Ngược lại Bash chỉ có thể cố gắng cầm hoà. Với n≤14n\le14 có thể duyệt để tìm ra chiến thuật hoà là ở nước chơi đầu tiên, Bash phải đặt bb vào ô chính giữa   ⟹  \implieshoà.
  4. Với n≥16n\ge16 và nn chẵn, chiến thuật này không còn hiệu quả nữa, do khi Bash đặt bb ở nước đầu thì bảng chia ra thành 2 phần, 1 phần chẵn và 1 phần lẻ độ dài ≥7\ge7. Do đó Chikapu sẽ luôn đưa được game về n≥7n\ge7 lẻ đi trước và thắng. (Chú ý rằng Bash không thể đi aa ở nước đầu tiên vì Chikapu sẽ tạo được bẫy và thắng). Đây là trường hợp khó nhất của bài toán và người bình thường không thể tự nghĩ ra được trừ khi ngồi chứng minh chặt chẽ các chiến thuật chơi cho trường hợp này.

m≥4m\ge4

Với m≥4m\ge4 thì kết quả luôn là hoà.

Pseudocode

Python
def solve(n, s, a):
m = len(s)
if m > n: return "Oh no!" # target string exceeds board size
set_A, set_S = set(a), set(s)
if m == 1:
return "Bash" if s[0] in set_A else "Oh no!" # single character check
if set_A != set_S:
return "Oh no!" # character sets must match
if m == 2 and s[0] == s[1]:
return "Chikapu" # pattern "aa"
if m == 3 and s[0] == s[2] != s[1]: # pattern "aba"
if n % 2 == 1 and n >= 7: return "Bash"
if n % 2 == 0 and n >= 16: return "Chikapu"
return "Oh no!"