Gửi bài giải
Điểm:
15,00
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
256M
Input:
stdin
Output:
stdout
Dạng bài
Ngôn ngữ cho phép
C, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch
Alice có ~n~ viên sỏi. Cô ta muốn chơi với Bob một trò chơi như sau:
- Đầu tiên, Bob phải chia ~n~ viên sỏi thành ~m~ đống, sao cho mỗi đống có ít nhất một viên sỏi.
- Hai người sẽ chơi một trò chơi và Alice là người đi trước.
- Đến lượt của mình, mỗi người sẽ chọn một đống sỏi (còn ít nhất một viên), và lây ra một số viên sỏi từ đống sỏi đó (có thể lấy hết nhưng không thể không lấy viên nào).
- Ai không thể thực hiện được lượt chơi của mình thì thua cuộc. Hãy giúp Bob tìm một cách chia các viên sỏi sao cho anh ta luôn thắng nếu chơi tối ưu sau đó.
Dữ liệu
- Dòng đầu tiên gồm số nguyên dương ~T~ là số bộ dữ liệu ~(1 \le T \le 1000)~.
- ~T~ dòng tiếp theo, mỗi dòng gồm hai số nguyên dương ~n, m~ ~(1 \le n \le 10^9, 1 \le m \le 10^5, n \ge m)~.
- Dữ liệu đầu vào đảm bảo tổng các giá trị ~m~ trong các bộ dữ liệu không vượt quá ~2 \times 10^5~.
Kết quả
- Với mỗi bộ dữ liệu:
- In ra
NO
nếu không có cách nào để Bob đảm bảo chiến thắng. - In ra
YES
nếu có cách để Bob đảm bảo chiến thắng. Tiếp theo in ra ~m~ số nguyên dương ~a_1, a_2, ..., a_m~ với ~a_i~ là số viên sỏi ở đống thứ ~i~.
- In ra
Ví dụ
Dữ liệu
3
3 1
4 2
5 5
Kết quả
NO
YES 2 2
NO
Giải thích
- Ở bộ dữ liệu đầu tiên, cách chia duy nhất là đặt cả ~3~ viên vào một đống sỏi. Alice chỉ cần lấy hết ~3~ viên sỏi trong lượt đi đầu tiên để đảm bảo chiến thắng.
- Ở bộ dữ liệu thứ hai, nếu Bob chia các viên sỏi thành hai nhóm, mỗi nhóm có ~2~ viên sỏi, anh ta luôn có chiến thuật lặp lại nước đi của Alice trên đống sỏi còn lại (ví dụ: nếu Alice bốc ~1~ viên sỏi ở đống ~1~ thì Bob bốc ~1~ viên sỏi ở đống ~2~ và ngược lại) để đảm bảo chiến thắng.
- Ỏ bộ dữ liệu thứ ba, cách chia duy nhất là chia ~5~ viên sỏi vào ~5~ đống khác nhau. Dễ thấy với cách chia này Bob không thể giành chiến thắng.
Bình luận