E014. Нахождение степени делителя факториала
Task text is translated from Russian for the selected interface language. Code is left unchanged.
Источник: e-maxx.ru/algo, страница PDF 43.
given два числа:
и
. it is required посчитать, с какой степенью делитель
Inputит в number
, т.е. find наибольшее
такое, что
делится на
.
Solution для случая простого
Рассмотрим сначала случай, когда
простое. Выпишем выражение для факториала в явном виде:
Заметим, что каждый
-ый член этого произведения делится на
, т.е. даёт +1 к ответу; количество таких членов
равно
.
Далее, заметим, что каждый
-ый член этого ряда делится на
, т.е. даёт ещё +1 к ответу (given, что
в
первой степени уже было учтено до этого); количество таких членов равно .
И так далее, каждый
-ый член ряда даёт +1 к ответу, а количество таких членов равно
. Таким образом, ответ равен величине: Эта сумма, разумеется, не бесконечная, т.к. только первые Exampleно членов отличны от нуля.
Следовательно, Asymptotic complexity такого Algorithmа равна
. Implementation:
int fact_pow (int n, int k) {
int res = 0;
while (n) {
n /= k;
res += n;
}
return res;
}
Solution для случая составного
Ту же идею применить здесь непосредственно уже нельзя.
Но мы можем факторизовать
, решить задачу для каждого его простого делителя, а потом выбрать минимум из ответов.
Более формально, пусть
— это
-ый делитель числа
, Inputящий в него в степени
. Решим задачу для
с
помощью вышеописанной формулы за
; пусть мы получили ответ
. Тогда ответом для составного
будет минимум из величин
.
given, что факторизация простейшим образом выполняется за
, получаем итоговую асимптотику
.
C# solution
auto-draft, review before submitusing System;
using System.Collections.Generic;
using System.Linq;
public static class AlgorithmDraft
{
// Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
int fact_pow (int n, int k) {
int res = 0;
while (n) {
n /= k;
res += n;
}
return res;
}
}
C++ solution
matched/originalint fact_pow (int n, int k) {
int res = 0;
while (n) {
n /= k;
res += n;
}
return res;
}
Java solution
auto-draft, review before submitimport java.util.*;
import java.math.*;
public class AlgorithmDraft {
// Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
int fact_pow (int n, int k) {
int res = 0;
while (n) {
n /= k;
res += n;
}
return res;
}
}
Материал разбит как Algorithmическая Task: изучить постановку, понять асимптотику и реализовать Algorithm на выбранном языке.
Vacancies for this task
Active vacancies with overlapping task tags are shown.
There are no active vacancies yet.