Cod sursa(job #2449858)

Utilizator voyagerSachelarie Bogdan voyager Data 20 august 2019 21:36:30
Problema Suma si numarul divizorilor Scor 40
Compilator py Status done
Runda Arhiva educationala Marime 1.3 kb
#!/usr/bin/env python3

import sys
sys.stdout = open('ssnd.out', 'w')

N, MOD = 30000, 9973
invMod = [0] * MOD

def gcd(a, b):
    if b == 0:
        return 1, 0, a
    else:
        x, y, d = gcd(b, a % b)
        return y, x - a // b * y, d

for a in range(MOD):
    x, _, d = gcd(a, MOD)
    x = x % MOD
    while x < 0: x += n
    invMod[a] = x

p = bytearray((N + 1) // 16 + 1)
primes = [2]
for i in range(3, int(N ** 0.5) + 1, 2):
    idx = i // 2
    if not p[idx >> 3] & (1 << (idx & 7)):
        for j in range(i * i, N + 1, 2 * i):
            idx = j // 2
            if not p[idx >> 3] & (1 << (idx & 7)):
                p[idx >> 3] |= 1 << (idx & 7)
for i in range(3, N, 2):
    idx = i // 2
    if not p[idx >> 3] & (1 << (idx & 7)):
        primes.append(i)

def solve(n):
    divs = []
    for p in primes:
        if n % p == 0:
            d = 0
            while n % p == 0:
                n /= p
                d += 1
            divs.append((p, d))
        if n == 1:
            break
    numDivs, sumDivs = 1, 1
    for p, d in divs:
        numDivs = (numDivs * (d + 1)) % MOD
        sumDivs = (sumDivs * ((p ** (d + 1) - 1) % MOD) * invMod[p - 1]) % MOD

    print(numDivs, sumDivs)

with open('ssnd.in', 'r') as f:
    for _ in range(int(f.readline())):
        n = int(f.readline())
        solve(n)