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

e-maxx algorithm original: C/C++ #algorithm #emaxx #math #number-theory
Der Aufgabentext wird für die gewählte Sprache aus dem Russischen übersetzt. Code bleibt unverändert.

Источник: e-maxx.ru/algo, страница PDF 43.

given два числа:

и

. it is required посчитать, с какой степенью делитель

Eingabeит в number

, т.е. find наибольшее

такое, что

делится на

.

Lösung для случая простого

Рассмотрим сначала случай, когда

простое. Выпишем выражение для факториала в явном виде:

Заметим, что каждый

-ый член этого произведения делится на

, т.е. даёт +1 к ответу; количество таких членов

равно

.

Далее, заметим, что каждый

-ый член этого ряда делится на

, т.е. даёт ещё +1 к ответу (given, что

в

первой степени уже было учтено до этого); количество таких членов равно .

И так далее, каждый

-ый член ряда даёт +1 к ответу, а количество таких членов равно

. Таким образом, ответ равен величине: Эта сумма, разумеется, не бесконечная, т.к. только первые Beispielно членов отличны от нуля.

Следовательно, Asymptotic complexity такого Algorithmusа равна

. Implementierung:

int fact_pow (int n, int k) {
int res = 0;
while (n) {

n /= k;

res += n;

}

return res;

}

Lösung для случая составного

Ту же идею применить здесь непосредственно уже нельзя.

Но мы можем факторизовать

, решить задачу для каждого его простого делителя, а потом выбрать минимум из ответов.

Более формально, пусть

— это

-ый делитель числа

, Eingabeящий в него в степени

. Решим задачу для

с

помощью вышеописанной формулы за

; пусть мы получили ответ

. Тогда ответом для составного

будет минимум из величин

.

given, что факторизация простейшим образом выполняется за

, получаем итоговую асимптотику

.

C# Lösung

Auto-Entwurf, vor dem Einreichen prüfen
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++ Lösung

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

Java Lösung

Auto-Entwurf, vor dem Einreichen prüfen
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;
    }
}

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

Stellen zu dieser Aufgabe

aktive Stellen with overlapping task tags are angezeigt.

Alle Stellen
Es gibt noch keine aktiven Stellen.