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

e-maxx algorithm original: C/C++ #algorithm #emaxx #math #number-theory
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 submit
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++ solution

matched/original
int fact_pow (int n, int k) {
        int res = 0;
        while (n) {
                n /= k;
                res += n;
        }
        return res;
}

Java solution

auto-draft, review before submit
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;
    }
}

Материал разбит как Algorithmическая Task: изучить постановку, понять асимптотику и реализовать Algorithm на выбранном языке.

Vacancies for this task

Active vacancies with overlapping task tags are shown.

All vacancies
There are no active vacancies yet.