Cod sursa(job #2877591)

Utilizator indianu_talpa_iuteTisca Catalin indianu_talpa_iute Data 24 martie 2022 23:17:44
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>
#define LL long long
#define SQR 1000000
#define MOD 9973

using namespace std;

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

LL powlog(LL n, LL k) {
    LL p = 1;
    while (k) {
        if (k % 2)
            p = p * n % MOD;
        n = n * n % MOD;
        k /= 2;
    }
    return p % MOD;
}

vector<LL> prime;
void generare() {
    bitset<SQR + 1> ciur;
    ciur[0] = ciur[1] = 1;
    for (LL i = 4; i <= SQR; i += 2)
        ciur[i] = 1;
    for (LL i = 3; i * i <= SQR; i += 2)
        if (!ciur[i])
            for (LL j = i * i; j <= SQR; j += 2 * i)
                ciur[j] = 1;
    prime.push_back(2);
    for (LL i = 3; i <= SQR; i += 2)
        if (!ciur[i])
            prime.push_back(i);
}

void rezolvare() {
    LL x, nrDiv = 1, sumDiv = 1;
    fin >> x;
    for (auto &prim: prime) {
        if (prim * prim > x)
            break;
        if (x % prim == 0) {
            LL p = 0;
            while (x % prim == 0)
                p++, x /= prim;
            nrDiv *= (p + 1);
            LL p1 = (powlog(prim, p + 1) - 1) % MOD;
            LL p2 = powlog(prim - 1, MOD - 2) % MOD;
            sumDiv = (((sumDiv * p1) % MOD) * p2) % MOD;
        }
    }
    if (x > 1)
        nrDiv *= 2, sumDiv = 1LL * sumDiv * (x + 1) % MOD;
    fout << nrDiv << ' ' << sumDiv << '\n';
}

int main() {
    generare();
    LL n;
    fin >> n;
    for (LL i = 0; i < n; i++)
        rezolvare();
    return 0;
}