E014. Нахождение степени делителя факториала
题目文本会按所选界面语言从俄语翻译;代码保持不变。
Источник: 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 已显示.
目前还没有活跃职位。