E014. Нахождение степени делителя факториала
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.
Источник: e-maxx.ru/algo, страница PDF 43.
given два числа:
и
. it is required посчитать, с какой степенью делитель
입력ит в number
, т.е. find наибольшее
такое, что
делится на
.
해법 для случая простого
Рассмотрим сначала случай, когда
простое. Выпишем выражение для факториала в явном виде:
Заметим, что каждый
-ый член этого произведения делится на
, т.е. даёт +1 к ответу; количество таких членов
равно
.
Далее, заметим, что каждый
-ый член этого ряда делится на
, т.е. даёт ещё +1 к ответу (given, что
в
первой степени уже было учтено до этого); количество таких членов равно .
И так далее, каждый
-ый член ряда даёт +1 к ответу, а количество таких членов равно
. Таким образом, ответ равен величине: Эта сумма, разумеется, не бесконечная, т.к. только первые 예제но членов отличны от нуля.
Следовательно, Asymptotic complexity такого 알고리즘а равна
. 구현:
int fact_pow (int n, int k) {
int res = 0;
while (n) {
n /= k;
res += n;
}
return res;
}
해법 для случая составного
Ту же идею применить здесь непосредственно уже нельзя.
Но мы можем факторизовать
, решить задачу для каждого его простого делителя, а потом выбрать минимум из ответов.
Более формально, пусть
— это
-ый делитель числа
, 입력ящий в него в степени
. Решим задачу для
с
помощью вышеописанной формулы за
; пусть мы получили ответ
. Тогда ответом для составного
будет минимум из величин
.
given, что факторизация простейшим образом выполняется за
, получаем итоговую асимптотику
.
C# 해법
자동 초안, 제출 전 검토using 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++ 해법
매칭됨/원본int fact_pow (int n, int k) {
int res = 0;
while (n) {
n /= k;
res += n;
}
return res;
}
Java 해법
자동 초안, 제출 전 검토import 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;
}
}
Материал разбит как 알고리즘ическая 문제: изучить постановку, понять асимптотику и реализовать 알고리즘 на выбранном языке.
Vacancies for this task
활성 채용 with overlapping task tags are 표시됨.
아직 활성 채용이 없습니다.