# your code goes here
import math
from collections import defaultdict
MAXN = 1000000
# Array to store the smallest prime factor for each number
spf = [i for i in range(MAXN + 1)]
def compute_spf():
"""Precomputes the Smallest Prime Factor (SPF) for all numbers up to MAXN."""
for i in range(2, int(math.isqrt(MAXN)) + 1):
if spf[i] == i: # i is prime
for j in range(i * i, MAXN + 1, i):
if spf[j] == j: # Update spf[j] if not already updated
spf[j] = i
def get_prime_factors(num):
"""Returns a dictionary of prime factors and their powers for a given number."""
factors = defaultdict(int)
while num > 1:
prime = spf[num]
factors[prime] += 1
num //= prime
return factors
# --- Example Usage ---
compute_spf()
numbers_to_factor = [12, 100, 999999]
for num in numbers_to_factor:
factors = get_prime_factors(num)
formatted = " * ".join(
[f"{p}^{count}" if count > 1 else str(p) for p, count in factors.items()]
)
print(f"{num} = {formatted}")
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCmltcG9ydCBtYXRoCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CgpNQVhOID0gMTAwMDAwMAoKIyBBcnJheSB0byBzdG9yZSB0aGUgc21hbGxlc3QgcHJpbWUgZmFjdG9yIGZvciBlYWNoIG51bWJlcgpzcGYgPSBbaSBmb3IgaSBpbiByYW5nZShNQVhOICsgMSldCgpkZWYgY29tcHV0ZV9zcGYoKToKICAgICIiIlByZWNvbXB1dGVzIHRoZSBTbWFsbGVzdCBQcmltZSBGYWN0b3IgKFNQRikgZm9yIGFsbCBudW1iZXJzIHVwIHRvIE1BWE4uIiIiCiAgICBmb3IgaSBpbiByYW5nZSgyLCBpbnQobWF0aC5pc3FydChNQVhOKSkgKyAxKToKICAgICAgICBpZiBzcGZbaV0gPT0gaTogICMgaSBpcyBwcmltZQogICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpICogaSwgTUFYTiArIDEsIGkpOgogICAgICAgICAgICAgICAgaWYgc3BmW2pdID09IGo6ICAjIFVwZGF0ZSBzcGZbal0gaWYgbm90IGFscmVhZHkgdXBkYXRlZAogICAgICAgICAgICAgICAgICAgIHNwZltqXSA9IGkKCmRlZiBnZXRfcHJpbWVfZmFjdG9ycyhudW0pOgogICAgIiIiUmV0dXJucyBhIGRpY3Rpb25hcnkgb2YgcHJpbWUgZmFjdG9ycyBhbmQgdGhlaXIgcG93ZXJzIGZvciBhIGdpdmVuIG51bWJlci4iIiIKICAgIGZhY3RvcnMgPSBkZWZhdWx0ZGljdChpbnQpCiAgICB3aGlsZSBudW0gPiAxOgogICAgICAgIHByaW1lID0gc3BmW251bV0KICAgICAgICBmYWN0b3JzW3ByaW1lXSArPSAxCiAgICAgICAgbnVtIC8vPSBwcmltZQogICAgcmV0dXJuIGZhY3RvcnMKCiMgLS0tIEV4YW1wbGUgVXNhZ2UgLS0tCmNvbXB1dGVfc3BmKCkKCm51bWJlcnNfdG9fZmFjdG9yID0gWzEyLCAxMDAsIDk5OTk5OV0KCmZvciBudW0gaW4gbnVtYmVyc190b19mYWN0b3I6CiAgICBmYWN0b3JzID0gZ2V0X3ByaW1lX2ZhY3RvcnMobnVtKQogICAgZm9ybWF0dGVkID0gIiAqICIuam9pbigKICAgICAgICBbZiJ7cH1ee2NvdW50fSIgaWYgY291bnQgPiAxIGVsc2Ugc3RyKHApIGZvciBwLCBjb3VudCBpbiBmYWN0b3JzLml0ZW1zKCldCiAgICApCiAgICBwcmludChmIntudW19ID0ge2Zvcm1hdHRlZH0iKQ==