Cod sursa(job #2478469)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 22 octombrie 2019 09:39:58
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>

using namespace std;

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

typedef long long ll;
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, ll b, ll &x, ll &y) {
    if (!b) {
        x = 1;
        y = 0;
        return;
    }
    modInv(b, a % b, x, y);
    ll aux = x;
    x = y;
    y = aux - (a / b) * y;
}

void solve(ll n) {
    ll sum = 1, nr = 1, inv, aux;
    for (int i = 0; i < k && primes[i] * primes[i] <= n; ++i)
        if (n % primes[i] == 0) {
            ll 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) {
        ll 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() {
    ll t, n;
    findPrimes();
    fin >> t;
    for (int i = 0; i < t; ++i) {
        fin >> n;
        solve(n);
    }
    return 0;
}