trang chủ / đề bài / rapsheet

Hồ sơ tội phạm

Đề bài

Mô tả

Mọi số nguyên không âm đều có biểu diễn trong hệ cơ số k. Ta gọi mỗi chữ số của biểu diễn đó là một k-it.

Với hai k-it a và b, XOR cơ số k của chúng được định nghĩa là (a+b)modk.

XOR cơ số k của hai số nguyên a và b, ký hiệu a⊕kb, là số nhận được bằng cách lấy XOR cơ số k trên từng cặp k-it tương ứng trong biểu diễn cơ số k của a và b (số nào ngắn hơn được bổ sung các k-it 0 ở phía trước). Chẳng hạn với k=3: 7=(21)3, 6=(20)3, và (21)3⊕3(20)3=(11)3=4, tức 7⊕36=4.

Bạn đã xâm nhập được vào kho hồ sơ tội phạm của sở cảnh sát, nhưng còn thiếu mật khẩu. Mật khẩu là một số nguyên nằm trong đoạn [0,n−1], và bạn được phép đoán nhiều nhất n lần.

Điểm khó là hệ thống tự thay đổi mật khẩu sau mỗi lần đoán sai: nếu mật khẩu trước khi đoán là x và bạn đoán số y≠x, hệ thống đổi mật khẩu thành số z thoả mãn x⊕kz=y.

Hãy tìm ra mật khẩu.

Bộ tương tác là thích ứng (adaptive): mật khẩu ban đầu không được cố định từ trước và có thể phụ thuộc vào các truy vấn của bạn, nhưng luôn đảm bảo tồn tại ít nhất một mật khẩu ban đầu trong [0,n−1] nhất quán với mọi câu trả lời đã nhận.

Dữ liệu vào

Dòng đầu tiên chứa số nguyên t - số lượng bộ test.

Với mỗi bộ test, đọc vào hai số nguyên n và k.

Tương tác

Với mỗi bộ test, sau khi đọc n và k, bạn được hỏi nhiều nhất n lần.

Mỗi lần hỏi, in ra một số nguyên y (0≤y≤2·107) rồi xoá bộ đệm (flush). Sau đó đọc vào một số nguyên r:

  • r=1: bạn đoán đúng mật khẩu hiện tại, hãy chuyển sang bộ test tiếp theo.
  • r=0: đoán sai, mật khẩu đã bị đổi theo quy tắc trên.
  • r=−1: truy vấn không hợp lệ hoặc bạn đã vượt quá n lần hỏi. Hãy kết thúc chương trình ngay lập tức.

Để flush, dùng fflush(stdout) hoặc cout.flush() trong C++, sys.stdout.flush() trong Python.

Ràng buộc

  • 1≤t≤10000
  • 1≤n≤3·104
  • 2≤k≤100
  • Tổng n trên tất cả các bộ test không vượt quá 3·104.
  • Mỗi truy vấn phải thoả 0≤y≤2·107.

Ví dụ

Input Output Giải thích
2
5 2
0
0
1
5 3
0
0
1
0
1
3
0
2
1
Cột Input là những gì hệ thống gửi cho bạn, cột Output là các lần đoán của bạn. Bộ test 1 (n=5, k=2) có mật khẩu ban đầu là 2. Đoán 0 sai, mật khẩu đổi thành z với 2⊕2z=0, tức z=2. Đoán 1 sai, mật khẩu đổi thành z với 2⊕2z=1, tức z=3. Đoán 3 đúng. Bộ test 2 (n=5, k=3) cũng có mật khẩu ban đầu 2: đoán 0 sai (mật khẩu thành 1 vì (2+1)mod3=0), đoán 2 sai (mật khẩu vẫn là 1), đoán 1 đúng.
1
1 2
1
0 n=1 nên mật khẩu chắc chắn bằng 0, đoán ngay lần đầu là trúng.
1
3 5
0
1
0
4
n=3, k=5, mật khẩu ban đầu là 1. Đoán 0 sai, mật khẩu đổi thành z với (1+z)mod5=0, tức z=4. Đoán 4 đúng.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0