Nguồn: Facebook Hacker Cup.Facebook Hacker Cup Subround 1B - Slot Machine Hacker
Tôi đã thử tạo một vài danh sách giá trị trả lại từ hàm bên dưới nhưng dường như không thể tìm thấy điều gì làm cho nó có thể dự đoán số ngẫu nhiên trong tương lai. Làm thế nào tôi sẽ đi về giải quyết một vấn đề như thế này?
Slot Machine Hacker
Bạn vừa kết bạn với một chàng trai người viết phần mềm cho máy khe. Sau khi đi chơi với anh ta một chút, bạn nhận thấy rằng anh ấy có một thiên hướng để thể hiện kiến thức của mình về cách các máy khe cắm hoạt động. Cuối cùng bạn có được anh ta để mô tả cho bạn chi tiết chính xác thuật toán được sử dụng trên một thương hiệu máy cụ thể. Thuật toán như sau:
int getRandomNumber() { secret = (secret * 5402147 + 54321) % 10000001; return secret % 1000; }
Hàm này trả về một số nguyên trong [0, 999]; mỗi chữ số đại diện cho một trong mười biểu tượng xuất hiện trên bánh xe trong một trạng thái máy cụ thể.secret ban đầu được đặt thành một số giá trị không âm mà bạn không biết.
Bằng cách quan sát hoạt động của máy đủ lâu, bạn có thể xác định giá trị của bí mật và do đó dự đoán kết quả trong tương lai. Biết kết quả trong tương lai bạn sẽ có thể đặt cược một cách thông minh và giành được nhiều tiền.
Nhập Dòng đầu tiên của đầu vào chứa số T dương, số lượng trường hợp thử nghiệm. Tiếp theo là các trường hợp kiểm tra T. Mỗi test bao gồm một số nguyên dương N, số quan sát bạn thực hiện. Các mã thông báo tiếp theo là các số nguyên từ 0 đến 999 mô tả các quan sát của bạn. Đầu ra Đối với mỗi trường hợp thử nghiệm, xuất ra 10 giá trị tiếp theo sẽ được hiển thị bởi máy được phân tách bằng khoảng trắng. Nếu trình tự bạn quan sát không thể được sản xuất bởi máy mà bạn của bạn mô tả cho bạn, hãy in “Máy sai” thay thế. Nếu bạn không thể xác định duy nhất 10 giá trị tiếp theo, thay vào đó hãy in “Không đủ quan sát”.
Ràng buộc T = 20 1 ≤ N ≤ 100 Các đầu vào không dài quá 3 ký tự và chỉ chứa chữ số 0-9.
mẫu đầu vào
5 1 968 3 767 308 284 5 78 880 53 698 235 7 23 786 292 615 259 635 540 9 862 452 303 558 767 105 911 846 462
đầu ra mẫu
Not enough observations 577 428 402 291 252 544 735 545 771 34 762 18 98 703 456 676 621 291 488 332 38 802 434 531 725 594 86 921 607 35 Wrong machine
Vì vậy, bạn không thử tính toán bí mật ban đầu. Nhưng làm thế nào bạn có thể chắc chắn rằng các ứng cử viên bạn tạo ra cho quan sát đầu tiên là ở tất cả các kết quả đầu ra có thể? Bạn có thể hiển thị mọi số trong [0, 10.000,000] có nghịch đảo đối với 'bí mật = (bí mật * 5402147 + 54321)% 10000001' không? –
@Wei Một số sẽ không, nhưng trường hợp đó đã được xử lý với logic "Máy sai". – marcog
OK, đối với bất kỳ số o nào, luôn có một số s khác, sao cho 'o = (s * 5402147 + 54321)% 10000001'. s có thể được tính bằng 's = ((o - 54321) * 5194600)% 10000001'. Vì vậy, thuật toán của bạn là tốt. –