E014. Нахождение степени делителя факториала

e-maxx algorithm original: C/C++ #algorithm #emaxx #math #number-theory
题目文本会按所选界面语言从俄语翻译;代码保持不变。

Источник: 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 已显示.

所有职位
目前还没有活跃职位。