Cod sursa(job #2615187)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 13 mai 2020 19:55:59
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
#define int long long
#define DAU  ios_base::sync_with_stdio(false); fin.tie(0); fout.tie(0);
#define PLEC fin.close(); fout.close(); return 0;
using namespace std;
const string problem("ssnd");
ifstream fin(problem + ".in");
ofstream fout(problem + ".out");
typedef long long i64;
const int N(1e6), MOD(9973);
bool ciur[N + 5];
vector<int> prime;
void Ciur() {
    for (int i = 2; i * i <= N; ++i)
        if (!ciur[i])
            for (int j = i * i; j <= N; j += i)
                ciur[j] = 1;
    for (int i = 2; i <= N; ++i)
        if (!ciur[i])
            prime.emplace_back(i);
}
i64 Powlog(i64 baza, i64 exponent) {
    i64 putere(1);
    while (exponent) {
        if (exponent & 1)
            putere *= baza;
        baza *= baza;
        exponent >>= 1;
    }
    return putere;
}
int q, nrap;
i64 n, d, nrd, sumd;
int32_t main() {
    DAU
    Ciur();
    fin >> q;
    while (q--) {
        fin >> n;
        nrd = sumd = 1;
        d = 0;
        while (prime[d] * prime[d] <= n) {
            if (n % prime[d] == 0) {
                nrap = 0;
                while (n % prime[d] == 0)
                    ++nrap, n /= prime[d];
                nrd *= (nrap + 1);
                sumd *= ((Powlog(prime[d], nrap + 1) - 1) / (prime[d] - 1));
                sumd %= MOD;
            }
            ++d;
        }
        if(n > 1) {
            nrd *= 2;
            sumd *= (n + 1);
            sumd %= MOD;
        }
        fout << nrd << ' ' << sumd << '\n';
    }
    PLEC
}