Anzahl der Teiler mithilfe der Primfaktorisierung

Ein naiver Ansatz, die Anzahl der Teiler einer positiven ganzen Zahl n zu bestimmen, besteht darin, alle Werte von 1 bis einschließlich n zu durchlaufen und zu prüfen, wie viele davon n teilen.

Allerdings ist dieser Ansatz sehr langsam. Stattdessen lässt sich die Anzahl der Teiler von n anhand seiner Primfaktoren ermitteln (das Finden der Primfaktoren benötigt nur O(n)\mathcal{O}(\sqrt{n}) Zeit).

Man kann sich eine Zahl als Produkt ihrer Primfaktoren vorstellen:

2=214=227=7124=23⋅3175=31⋅5284=22⋅31⋅71300=22⋅31⋅52n=p1e1⋅p2e2⋅p3e3⋅...⋅pkek\begin{aligned} 2 &= 2^1 \\ 4 &= 2^2 \\ 7 &= 7^1 \\ 24 &= 2^3 \cdot 3^1 \\ 75 &= 3^1 \cdot 5^2 \\ 84 &= 2^2 \cdot 3^1 \cdot 7^1 \\ 300 &= 2^2 \cdot 3^1 \cdot 5^2\\ n &= p_1^{e_1} \cdot p_2^{e_2} \cdot p_3^{e_3} \cdot ... \cdot p_k^{e_k} \\ \end{aligned}

Um die Anzahl der Teiler von n zu berechnen, nimmt man alle Exponenten der Primfaktoren, erhöht jeden um 1 und multipliziert diese Werte anschließend miteinander:

2=21  ⟹  1+1=24=22  ⟹  2+1=37=71  ⟹  1+1=224=23⋅31  ⟹  (3+1)⋅(1+1)=875=31⋅52  ⟹  (1+1)⋅(2+1)=684=22⋅31⋅71  ⟹  (2+1)⋅(1+1)⋅(1+1)=12300=22⋅31⋅52  ⟹  (2+1)⋅(1+1)⋅(2+1)=18n=p1e1⋅p2e2⋅p3e3⋅...⋅pkek  ⟹  (e1+1)⋅(e2+1)⋅(e3+1)\begin{aligned} 2 &= 2^1 &&\implies 1 + 1 &&= 2\\ 4 &= 2^2 &&\implies 2 + 1 &&= 3\\ 7 &= 7^1 &&\implies 1 + 1 &&= 2\\ 24 &= 2^3 \cdot 3^1 &&\implies (3 + 1) \cdot (1 + 1) &&= 8\\ 75 &= 3^1 \cdot 5^2 &&\implies (1 + 1) \cdot (2 + 1) &&= 6\\ 84 &= 2^2 \cdot 3^1 \cdot 7^1 &&\implies (2 + 1) \cdot (1 + 1) \cdot (1 + 1) &&= 12\\ 300 &= 2^2 \cdot 3^1 \cdot 5^2 &&\implies (2 + 1) \cdot (1 + 1) \cdot (2 + 1) &&= 18\\ n &= p_1^{e_1} \cdot p_2^{e_2} \cdot p_3^{e_3} \cdot ... \cdot p_k^{e_k} &&\implies (e_1 + 1) \cdot (e_2 + 1) \cdot (e_3 + 1) \\ \end{aligned}

Diese Vorgehensweise ähnelt stark der Methode, mit der wir die Primfaktoren von n bestimmen:

n = ...
p, divisors = 1, 1          # Primfaktor und Anzahl der Teiler

while p * p <= n:           # solange p <= sqrt(n)
    p += 1                  # Erhöhe p in jedem Durchlauf um 1
    if n % p != 0:          # Nichts tun, wenn n nicht durch p teilbar ist
        continue
    
    exp = 0                 # Zähler für den Exponenten
    while n % p == 0:       # so oft wie möglich teilen
        n //= p
        exp += 1
    divisors *= exp + 1     # Produkt aktualisieren

if n > 1:                   # wenn p > sqrt(n), dann ist n selbst ein Primfaktor
    divisors *= 2           # füge n als Teiler mit Exponent 1 hinzu
print(divisors)

Aufgabe: Finde die Anzahl der Teiler von n

Gegeben ist eine ganze Zahl n. Bestimme, wie viele Teiler n besitzt.

Eingabe

Die erste Zeile der Eingabe enthält eine einzelne ganze Zahl n (2 ≤ n ≤ 10910^9).

Ausgabe

Das Programm soll die Anzahl der Teiler von n ausgeben.

Beispiele

Eingabe

Ausgabe

8

4

17

2

2048

12

48

10

Bonus: Warum erhalten wir durch das Addieren von 1 zu den Exponenten und anschließendes Multiplizieren die Gesamtzahl der Teiler von n?

Die Grundidee hinter dieser Formel zur Bestimmung der Anzahl der Teiler von n ergibt sich aus der Kombination seiner Primfaktoren. Der Exponent jedes Faktors gibt an, wie oft dieser Faktor in einem Teiler von n vorkommen kann. Indem man zu jedem Exponenten 1 hinzufügt, schließt man auch die Möglichkeit ein, dass ein Faktor gar nicht verwendet wird (was den Teiler 1 einschließt) sowie die Fälle, in denen alle Faktoren vollständig genutzt werden (was n selbst einschließt). Durch das Multiplizieren dieser (Exponent + 1)-Werte jedes Primfaktors erhält man die Gesamtzahl möglicher Teiler von n.

Constraints

Time limit: 1.6 seconds

Memory limit: 512 MB

Output limit: 1 MB