Cod sursa(job #3357822)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 15:17:52
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
long long n, i, k, d, w, j, nr, x, p, s, v[500001];
bool ciur[1000001];

long long powmod(long long base, long long exp, long long mod) {
    long long result = 1;
    base %= mod;
    while (exp > 0) {
        if (exp & 1) result = (result * base) % mod;
        base = (base * base) % mod;
        exp >>= 1;
    }
    return result;
}

int main() {
    fin >> n;
    ciur[1] = 1;
    for (i = 2; i <= 1000000; i++) {
        if (!ciur[i]) {
            v[++k] = i;
            for (j = i * i; j <= 1000000; j += i)
                ciur[j] = 1;
        }
    }
    for (i = 1; i <= n; i++) {
        fin >> x;
        s = 1;
        p = 1;
        for (d = 1; d <= k && v[d] * v[d] <= x; d++) {
            if (x % v[d] == 0) {
                nr = 0;
                while (x % v[d] == 0) {
                    nr++;
                    x /= v[d];
                }
                s *= (nr + 1);
                long long power = powmod(v[d] % 9973, nr + 1, 9973);
                long long denom = powmod((v[d] - 1) % 9973, 9971, 9973); // Fermat's little theorem: inv(a) = a^(p-2) mod p
                long long sum = ((power - 1 + 9973) % 9973) * denom % 9973;
                p = (p * sum) % 9973;
            }
        }
        if (x > 1) {
            s *= 2;
            long long modx = x % 9973;
            long long power = (modx * modx) % 9973;
            long long sum = (power - 1 + 9973) % 9973;
            long long denom = powmod((modx - 1 + 9973) % 9973, 9971, 9973);
            sum = sum * denom % 9973;
            p = (p * sum) % 9973;
        }
        fout << s << " " << p << "\n";
    }
    return 0;
}