Марсианские факториалы

Марсианские факториалы

Vladislav Tolstikov

Задачу протестировать можно тут.

(Время: 1 сек. Память: 16 Мб)

В 3141 году очередная экспедиция на Марс обнаружила в одной из пещер таинственные знаки. Они однозначно доказывали существование на Марсе разумных существ. Однако смысл этих таинственных знаков долгое время оставался неизвестным. Недавно один из ученых, профессор Очень-Умный, заметил один интересный факт: всего в надписях, составленных из этих знаков, встречается ровно K различных символов. Более того, все надписи заканчиваются на длинную последовательность одних и тех же символов.

Вывод, который сделал из своих наблюдений профессор, потряс всех ученых Земли. Он предположил, что эти надписи являются записями факториалов различных натуральных чисел в системе счисления с основанием K. А символы в конце – это конечно же нули – ведь, как известно, факториалы больших чисел заканчиваются большим количеством нулей. Например, в нашей десятичной системе счисления факториалы заканчиваются на нули начиная с 5! = 1·2·3·4·5 = 120. А у числа 100! в конце следует 24 нуля в десятичной системе счисления и 48 нулей в системе счисления с основанием 6 – так что у предположения профессора есть разумные основания!

Теперь ученым срочно нужна программа, которая по заданным числам N и K найдет количество нулей в конце записи в системе счисления с основанием K числа N! = 1·2·3·…·(N-1)·N, чтобы они могли проверить свою гипотезу. Вам придется написать им такую программу!

Входные данные

Входной файл INPUT.TXT содержит числа N и K, разделенные пробелом. (1 ≤ N ≤ 10^9, 2 ≤ K ≤ 1000).

Выходные данные

Выведите в выходной файл OUTPUT.TXT число X - количество нулей в конце записи числа N! в системе счисления с основанием K.

Примеры

№ INPUT.TXT OUTPUT.TXT

1 5 10 1

2 100 10 24

3 100 6 48

4 3 10 0


Для начала необходимо разобраться откуда берутся нули в конце числа N в разных системах счисления, так как мы будем рассматривать разложение на простые множители, факториал будем считать каким-то числом N.

Теперь разберемся с десятичной системой счисления, пускай какое-то число N имеет вид:

(1)

Очевидно, что нули в конце числа будут появляться только при умножение 2 на 5, то есть количество нулей можно выразить как min(a1, a2), видим что a1 всегда будет больше a2, в итоге получим что количество нулей в числе N в десятичной системе счисления равно min(a1, a2) = a2.

Научимся считать на конкретном примере.

Пускай мы хотим узнать сколько нулей содержит 130!.

Посчитаем сначала количество пятёрок в 130!, для этого 130 разделим на 5, потом есть числа где пятёрки встречаются два раза, поэтому разделим 130 на 25, потом 130 на 125 и так далее пока это возможно. Просуммировав получим количество пятёрок - 26 + 5 + 1 = 32. То есть 130! содержит 32 нуля.

По этому принципу мы можем подсчитать сколько содержится число p в некотором числе N!.

Пускай мы работает в системе счисления с основанием K, разложим K на простые множители, так же мы имеем разложение N. Тогда нулей будет столько сколько разложение числа K встречается в разложение N.

Теперь выведем обобщенный принцип подсчета. Находим какие простые множители содержит в себе число K, запоминаем сколько встречается каждый множитель. Потом для каждого простого множителя из K считаем количество таких простых чисел в N!, делим это количество на число раз, которые этот множитель входит в K, и выбираем минимум из ответа или этого результата.

Разберем на конкретном примере.

Например, найдем количество нулей в числе 50! в системе счисления с основанием 12.

12 = 3 * 2^2

Найдем количество 3 в 50!: 50 / 3 + 50 / 9 + 50 / 27 = 22

3 входит в разложение K в первой степени, тогда текущий ответ: 22 / 1 = 22

Найдем количество 2 в 50!: 50 / 2 + 50 / 4 + 50 / 8 + 50 / 16 + 50 / 32 = 47

2 входит в разложение K во второй степени, тогда текущий ответ

min(22, 47 / 2) = min(22, 23) = 22

И того имеем 22 нуля в 50! в системе счисления с основанием 12.

Теперь рассмотрим детали реализации:

(2)

В строке 4 выбираем достаточно большое число (ответ не должен превысить его). В строке 5 цикл который идет по простым делителям k (благодаря тому что мы делим k внутри цикла на текущие простое число). В строках 8-11 считаем сколько раз число k содержит простой делитель i, и в тоже время делим его на этот делитель. В строках 14-17 считаем сколько раз число n! содержит простой делитель i. В строке 18 выбираем минимальное число между ответов и текущим полученным результатом.

Спасибо за внимание.


Report Page