Cod sursa(job #1776429)

Utilizator razvan242Zoltan Razvan-Daniel razvan242 Data 11 octombrie 2016 12:08:33
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

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

const long long MOD = 9973;
const long long MAXCIUR = 1e6 + 1;
bitset<MAXCIUR> viz;
long long primes[MAXCIUR], cnt;

inline void ciur() {
    primes[++cnt] = 2;
    for (long long i = 4; i < MAXCIUR; i += 2)
        viz[i] = 1;
    for (long long i = 3; i < MAXCIUR; i += 2) {
        if (viz[i] == 0) {
            primes[++cnt] = i;
            for (long long j = i * i; j < MAXCIUR; j += i)
                viz[j] = 1;
        }
    }
}

inline long long power(long long a, long long b) {
    long long ans = 1;
    if (a < 2)
        return a;
    for (long long i = 0; (1LL << i) <= b; ++i) {
        if (b & (1LL << i)) {
            ans = (ans * a) % MOD;
        }
        a = (a * a) % MOD;
    }
    return ans % MOD;
}

inline void solve() {
    long long n;
    fin >> n;
    long long d, e;
    long long s = 1, nr = 1;
    long long a, b;
    for (long long i = 1; i <= cnt && 1LL * primes[i] * primes[i] <= n; ++i) {
        e = 0;
        d = primes[i];
        while (n % d == 0) {
            ++e;
            n /= d;
        }
        if (e == 0)
            continue;
        nr = ((nr % MOD) * ((e + 1) % MOD)) % MOD;
        a = (power(d, e + 1) + MOD - 1) % MOD;
        b = power(d - 1, MOD - 2);
        s = ((s % MOD) * (a % MOD) * (b % MOD)) % MOD;
    }
    if (n > 1) {
        nr = (nr * 2) % MOD;
        s = (1LL * s * (n + 1) % MOD);
    }
    fout << nr << ' ' << s << '\n';
}

int main()
{
    long long t;
    ciur();
    for (fin >> t; t; --t) {
        solve();
    }
    return 0;
}