Cod sursa(job #2478464)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 22 octombrie 2019 09:31:32
Problema Suma divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 1e6, MOD = 9973;
bool sieve[MAXN + 1];
int primes[MAXN + 1], k;

void findPrimes() {
    for (int i = 2; i <= MAXN; ++i)
        if (!sieve[i]) {
            primes[k++] = i;
            for (int j = i; j <= MAXN; j += i)
                sieve[j] = true;
        }
}

void modInv(int a, int b, int &x, int &y) {
    if (!b) {
        x = 1;
        y = 0;
        return;
    }
    modInv(b, a % b, x, y);
    int aux = x;
    x = y;
    y = aux - (a / b) * y;
}

void solve(int n) {
    int sum = 1, nr = 1, inv, aux;
    for (int i = 0; i < k && primes[i] * primes[i] <= n; ++i)
        if (n % primes[i] == 0) {
            int power = primes[i], exp = 1;
            while (n % primes[i] == 0) {
                n /= primes[i];
                power *= primes[i];
                ++exp;
            }
            nr = (nr * exp) % MOD;
            power = (power - 1) % MOD;
            sum = (sum * (power % MOD)) % MOD;
            modInv(primes[i] - 1, MOD, inv, aux);
            if (inv < 0)
                inv += MOD;
            sum = (sum * (inv % MOD)) % MOD;
        }
    if (n > 1) {
        int power;
        nr = (nr * 2) % MOD;
        power = ((n % MOD) * (n % MOD)) % MOD;
        power = (power - 1) % MOD;
        sum = (sum * (power % MOD)) % MOD;
        modInv(n - 1, MOD, inv, aux);
        if (inv < 0)
            inv += MOD;
        sum = (sum * (inv % MOD)) % MOD;
    }
    fout << nr << ' ' << sum << '\n';
}

int main() {
    int t, n;
    findPrimes();
    fin >> t;
    for (int i = 0; i < t; ++i) {
        fin >> n;
        solve(n);
    }
    return 0;
}