Cod sursa(job #2376233)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 8 martie 2019 14:20:22
Problema Suma si numarul divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

#define MOD 9973
#define MAX 1000001

std::ifstream fin("ssnd.in");
std::ofstream fout("ssnd.out");

int t;
int64_t n;

int nrPrimes;
int primes[MAX];
bool sieve[MAX];

int pow(int x, int n) {
    if (!n)
        return 1;

    if (n & 1)
        return pow(x * x % MOD, n >> 1) * x % MOD;
    return pow(x * x % MOD, n >> 1) % MOD;
}

int modInv(int x) {
    return pow(x, MOD - 2);
}

int main() {
    for (int i = 2; i * i < MAX; i++)
        if (!sieve[i])
            for (int j = i * i; j < MAX; j += i)
                sieve[j] = true;

    for (int i = 2; i < MAX; i++)
        if (!sieve[i])
            primes[nrPrimes++] = i;

    fin >> t;
    while (t--) {
        fin >> n;
        int num = 1, sum = 1;
        for (int i = 0; 1LL * primes[i] * primes[i] <= n; i++)
            if (n % primes[i] == 0) {
                int exp = 0;
                while (n % primes[i] == 0) {
                    exp++;
                    n /= primes[i];
                }

                num *= exp + 1;
                sum = sum * (pow(primes[i], (exp + 1)) - 1) % MOD * modInv(primes[i] - 1) % MOD;
            }

        if (n > 1) {
            num *= 2;
            sum = sum * (n * n % MOD - 1) % MOD * modInv(n - 1) % MOD;
        }
        fout << num << ' ' << sum << '\n';
    }

    fout.close();
    return 0;
}