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

e-maxx algorithm original: C/C++ #algorithm #emaxx #math #number-theory
선택한 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 표시됨.

전체 채용
아직 활성 채용이 없습니다.