Mô tả thử thách
Đối với mỗi số nguyên dương n
tồn tại một số có dạng 111...10...000
chia hết cho n
số đó là số thập phân bắt đầu bằng tất cả 1
và kết thúc bằng tất cả 0
. Điều này rất dễ chứng minh: nếu chúng ta lấy một tập hợp n+1
các số khác nhau dưới dạng 111...111
(tất cả 1
), thì ít nhất hai trong số chúng sẽ cho cùng một phần còn lại sau khi chia theo n
(theo nguyên tắc pigeonhole). Sự khác biệt của hai số này sẽ chia hết cho n
và sẽ có dạng mong muốn. Mục đích của bạn là viết một chương trình tìm thấy số này.
Mô tả đầu vào
Một số nguyên dương.
Mô tả đầu ra
Một số p
ở dạng 111...10...000
, như vậy p ≡ 0 (mod n)
. Nếu bạn tìm thấy nhiều hơn một - hiển thị bất kỳ cái nào trong số chúng (không cần phải là cái nhỏ nhất).
Ghi chú
Chương trình của bạn phải đưa ra câu trả lời trong một khoảng thời gian hợp lý. Điều đó có nghĩa là vũ phu không được phép:
p = 0
while (p != 11..10.00 and p % n != 0)
p++
Đây cũng không phải là:
do
p = random_int()
while (p != 11..10.00 and p % n != 0)
Lặp lại thông qua các số dưới dạng 11..10..00
được cho phép.
Chương trình của bạn không cần xử lý đầu vào lớn tùy ý - giới hạn trên là bất cứ điều gì giới hạn trên của ngôn ngữ của bạn.
Đầu ra mẫu
2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110
1
và ít nhất một 0
, nếu không thì 0
là một giải pháp cho mọi đầu vào. (Sẽ rất tốt để làm rõ điều này mặc dù.)
1
nên làm việc.