(Вычеркнуто 44 все еще 44.) Спасибо Fireflame241 за сохранение байта!
P=input();i=P/3
while i*10%P-1:i-=1
print i
Попробуйте онлайн!
Существует ровно один номер между 0
и P-1
который является обратным 10
. Но если этот обратный u
случай больше, чем P/2
, то (u-P)
он также обратный, и имеет меньшее абсолютное значение, чем u
. Вот и получается, что мы действительно ищем уникальный номерx
между -P/2
и P/2
который является обратным к 10
.
Код выше делает именно это, начиная с (этажа) P/2
и спускаясь вниз, пока не будет достигнут обратный. Это должно произойти для некоторого числа больше, чем -P/2
до тех пор, P
пока простое число больше, чем 10
. Точнее, оно прекратится тогда и только тогда, когдаP
это взаимно 10
.
Изменить: На самом деле оказывается, что x
гарантированно находится между -P/3
и P/3
, поэтому текущая версия начинается сP/3
и оттуда вниз. См. Раздел « Улучшенная граница» для объяснения этого.
Математическое объяснение
Для меня не сразу было очевидно, почему тест делимости работает. Вот объяснение, на случай, если кому-то еще будет интересно.
Позвольте P
быть простое число, больше, чем 10
, чья последняя цифра b
. таким образом
P = 10a + b
где a > 0
и 0 <= b < 10
. На самом деле b
либо 1
, 3
, 7
, или 9
, так как простое число , большее 10
должно заканчиваться в одной из этих цифр.
Теперь предположим bx + a = 0 (mod P)
. потом
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
Поскольку P
простое число, целые числа mod P
являются интегральной областью . Так что либоb = 0 (mod P)
, либо 1 - 10x = 0 (mod P)
.
Мы знаем 0 <= b < 10 < P
, так что если b = 0 (mod P)
тогда b = 0
. Но мы сказали , b
либо 1
, 3
, 7
, или 9
, так что это невозможно. Поэтому 1 - 10x = 0 (mod P)
так 10x = 1 (mod P)
. Другими словами, x
это обратное 10
, по модулюP
.
Теперь предположим, что N
это неотрицательное целое число, последняя цифра которого d
, поэтому у N = 10c + d.
нас есть цепочка эквивалентных утверждений:
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED.
Полезность?
Мне также было интересно, будет ли тест делимости (задан N = 10c + d
, заменен N
на dx + c
) действительно продуктивным на практике. Или, по крайней мере, надежно ли заменить N
на число меньше, чемN
(в абсолютном значении)?
Предположим N = 10c + d
, где c >= 0
и 0 <= d < 10
. Поэтому 10c = N - d <= N
. По неравенству треугольника,
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
Таким образом, если 5P <= 9N/10
, тогда |c + dx| < N
.
В частности, если N >= 6P
, то |c + dx| < N
. Таким образом, учитывая , P
мы начнем с расчета 2P
, 3P
..., 6P
наряду с x
. Затем дается N
, мы проводим тест делимостных несколько раз , пока мы не достигнем числа меньше или равно 6P
, и проверить , является ли результат любой из чисел 0
, P
, 2P
..., 6P
.
(Конечно, всякий раз, когда мы достигаем отрицательного числа, мы заменяем его его абсолютным значением, что хорошо, так q
как делится на P
то и только если (-q)
есть.)
Улучшенная граница
Я заметил, что |x|/P
никогда не казалось близким 1/2
. На самом деле казалось, что это всегда было меньше 1/3
... или, при ближайшем рассмотрении, это всегда было очень близко к 1/10
или 3/10
. Самым большим, что он когда-либо получал 4/13
(что случается, когда P=13
и x=4
). С чего бы это?
Позвольте u
быть целым числом и предположим, что 10u = kP + 1
для некоторого целого k
, так u
что обратное 10
, по модулю P
. Тогда мы также знаем, что k
это относительно простое число 10
, так k(-P)
как эквивалентно по 1
модулю 10
.
Теперь мы знаем, что все обратные по 10
модулю P
отличаются на кратные P
, поэтому мы можем взять целое число u
и либо добавить, либо вычесть кратные P
по желанию, и результат всегда будет обратным к 10
модулю P
. Предположим, мы решили вычесть P
из u
: мы получаем
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
Другими словами, уменьшение (соответственно увеличение) u
на P
соответствует уменьшению (увеличению) k
на 10
. Мы хотим добавить / вычесть кратные P
от u
до тех пор, пока левая часть не будет минимизирована по абсолютной величине; но левая сторона минимизируется именно тогда, когда правая сторона минимизирована, и поэтому мы хотим добавить / вычесть 10
изk
пока правая рука не сворачивается в абсолютной величине.
Но мы знаем , что это произойдет , когда k
между -5
и 5
, и , следовательно , (так как k
взаимно простое с 10
) это означает , что k
либо -3
, -1
, 1
или 3
. (Это содержание комментария @ Neil к OP. Спасибо, Neil! )
Таким образом , когда |u|
минимизируется (т.е. u=x
), мы будем иметь x/P = u/P = k/10 + 1/(10P)
, где k
либо -3
, -1
, 1
или 3
. Поэтому |x|/P <= 3/10 + 1/(10P)
. Эквивалентно |x| <= (3P + 1)/10
.
Далее, это неравенство строгое P=11
, потому что у P=11
нас есть x=-1
и k=-1
. Наименьшее, P
для которого выполняется равенство P=13
(где x=4
и k=3
).
Поэтому самое большое, что |x|/P
когда-либо получается 3/10 + 1/(10*13)
, это потому, что P=13
это первое простое число, для которого мы имеем k=3
, и среди тех, у кого k=3
этот 1/(10P)
термин самый большой, когда P
он наименьший (т. Е. At P=13
). Поэтому для всех P
у нас тоже есть |x|/P <= 3/10 + 1/130 = 4/13 < 1/3
. Это объясняет, почему в приведенном выше коде мы можем инициализировать, i = P/3
а не начинать с P/2
.
Кроме того, теперь можно улучшить границы в разделе « Полезность » выше.
Лемма : давай N = 10c + d
где c > 0
и 0 <= d <= 9
. Потом c + d|x| < N/10 + 9(3P + 1)/10
. (Обратите внимание на строгое неравенство.)
Доказательство леммы: по случаям. Дело I: d = 0
так N = 10c
. Потом c + d|x| = c = N/10 < N/10 + 9(3P + 1)/10
.
Случай II 0 < d <= 9
. Тогда 10c = N - d < N
так c < N/10
. Следовательноc + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10
. QED.
Таким образом, если N > 3P
(и N = 10c + d
как прежде), то
3P + 1 <= N
9(3P + 1)/10 <= 9N/10
N/10 + 9(3P + 1)/10 <= N
c + d|x| < N/10 + 9(3P + 1)/10 <= N
Так что, если N > 3P
тогда c + d|x| < N
.
Таким образом, мы имеем только , чтобы найти P
, 2P
и 3P
, наряду с x
. Учитывая N > 0
, в то время как N > 3P
мы заменим N
на |c + dx|
, который уменьшается N
. В конце концов мы получим N <= 3P
; в этой точке мы останавливаемся и проверить , является ли N
равно ни одному из чисел 0
, P
, 2P
, или 3P
.
Мы не можем сделать лучше, чем 3P
в целом. Например, предположим, P = 13
и N = 39
так x = 4
. Затем замена N
на dx + c = 9(4) + 3
листья N
без изменений.
x
по абсолютной величине значение,10*x-1
которое делится на входные данные.