Ban đầu có n đống ô vuông. Alice và Bob luân phiên, Alice đi trước. Trong một lượt, người chơi chọn một đống có x ô rồi chia toàn bộ đống đó thành hai đống mới có kích thước dương a và b, sao cho a+b=x và a=b.
Một đống kích thước 1 hoặc 2 không thể chia hợp lệ. Người không còn nước đi sẽ thua. Hãy xác định người thắng khi cả hai chơi tối ưu.
Input
Dòng đầu chứa số nguyên T, là số test.
Mỗi test gồm:
Một dòng chứa số nguyên n.
Một dòng chứa n số nguyên a1,a2,…,an, là kích thước các đống.
Output
Với test thứ i, in Case i: Alice nếu Alice thắng; ngược lại in Case i: Bob.
Constraints
1≤T≤1000.
1≤n≤100.
1≤ai≤104.
Scoring
Subtask 1 (50% số điểm): T≤10,n≤4 và ai≤15.
Subtask 2 (50% số điểm): Không có giới hạn bổ sung.
Example
Test 1
Input
4
1
1
2
3 5
3
4 7 10
2
13 18
Output
Case 1: Bob
Case 2: Alice
Case 3: Bob
Case 4: Alice
Giải thích: Các Grundy cần dùng là g(1)=0,g(3)=1,g(5)=2, g(4)=g(7)=g(10)=0,g(13)=3 và g(18)=4. Xor theo từng test lần lượt là
0,3,0,7.
Lời giải tóm tắt
Ý tưởng: \
Phân tích: Một nước trên đống x biến nó thành hai trò chơi độc lập kích thước a và x-a. Grundy của hậu trạng thái là g(a) xor g(x-a), không phải tổng số học. Chỉ xét a < x-a để hai phần khác nhau và tránh đếm lặp.
Thuật toán: Tiền xử lý tăng dần đến 10000 theo g(x)=mex{g(a) xor g(x-a) | 1≤a<x-a}. Với mỗi test, xor g(a_i) của các đống; in Alice khi xor khác 0, ngược lại in Bob.
Chứng minh đúng: Mỗi cách tách hợp lệ xuất hiện đúng một lần trong tập recurrence, và không có hậu trạng thái không hợp lệ nào được thêm vào. Theo định lý tổng rời, Grundy của hai đống mới là xor của chúng; do đó mex tính đúng g(x). Các đống ban đầu cũng độc lập, nên xor toàn bộ g(a_i) là Grundy của ván. Thuật toán phân loại thắng thua chính xác theo việc giá trị này có bằng 0 hay không.
Độ phức tạp: Tiền xử lý trực tiếp dùng O(M^2) thời gian và O(M) bộ nhớ với M=10000; mỗi test dùng O(n) thời gian.