canuc80k5307·8/50

Hai Phần Khác Nhau

Nộp bài trên LQDOJ

Bài 53 · Sprague Grundy Theorem

Ban đầu có đố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ó ô rồi chia toàn bộ đống đó thành hai đống mới có kích thước dương và , sao cho và .

Một đống kích thước hoặc 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 , là số test.
  • Mỗi test gồm:
  • Một dòng chứa số nguyên .
  • Một dòng chứa số nguyên , là kích thước các đống.

Output

  • Với test thứ , in Case i: Alice nếu Alice thắng; ngược lại in Case i: Bob.

Constraints

  • .
  • .
  • .

Scoring

  • Subtask ( số điểm): và .
  • Subtask ( 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à , và . Xor theo từng test lần lượt là .

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.