Описание задачи
Для каждого положительного целого числа n
существует число, имеющее форму, 111...10...000
которая делится на n
то есть десятичное число, которое начинается со всех 1
и заканчивается всеми 0
. Это очень легко доказать: если мы возьмем набор n+1
различных чисел в виде 111...111
(все 1
), то по крайней мере два из них дадут один и тот же остаток после деления на n
(согласно принципу голубя). Разница между этими двумя числами будет кратна n
и будет иметь желаемую форму. Ваша цель - написать программу, которая найдет этот номер.
Описание ввода
Целое положительное число.
Описание вывода
Число p
в форме 111...10...000
, такое что p ≡ 0 (mod n)
. Если вы найдете более одного - отобразите любой из них (необязательно самый маленький).
Заметки
Ваша программа должна дать ответ в разумные сроки. Что означает, что грубое принуждение не разрешено:
p = 0
while (p != 11..10.00 and p % n != 0)
p++
И это не так:
do
p = random_int()
while (p != 11..10.00 and p % n != 0)
Итерация по номерам в форме 11..10..00
разрешена.
Ваша программа не должна обрабатывать произвольно большие входные данные - верхняя граница равна верхней границе вашего языка.
Пример выходов
2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110
1
и хотя бы одно 0
, иначе 0
это решение для любого ввода. (Было бы хорошо, чтобы уточнить это, хотя.)
1
должен работать.