Cod sursa(job #3284344)

Utilizator Razvan23Razvan Mosanu Razvan23 Data 11 martie 2025 14:59:33
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;

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

bool fr[1000005];
long long t, n;
vector<long long> v;

long long Putere(long long x, long long e) {
    long long a = 1;
    while (e != 0) {
        if (e % 2 == 1) a = (a * x) % 9973;
        x = (x * x) % 9973;
        e /= 2;
    }
    return a;
}

void Descompunere(long long t) {
    long long divizori = 1, suma = 1;
    for (int i = 0; i < v.size() && v[i] * v[i] <= t; ++i) {
        long long d = v[i];
        if (t % d == 0) {
            long long p = 0;
            while (t % d == 0) {
                p++;
                t /= d;
            }
            divizori *= (p + 1);
            suma = (suma * ((Putere(d, p + 1) - 1 + 9973) % 9973 * Putere(d - 1, 9971)) % 9973) % 9973;
        }
    }
    if (t > 1) {
        divizori *= 2;
        suma = (suma * ((Putere(t, 2) - 1 + 9973) % 9973 * Putere(t - 1, 9971)) % 9973) % 9973;
    }
    fout << divizori << " " << suma << "\n";
}

int main() {
    long long i, j;
    fr[0] = fr[1] = true;
    for (i = 2; i * i <= 1000000; i++)
        if (!fr[i])
            for (j = i * i; j <= 1000000; j += i)
                fr[j] = true;
    for (i = 2; i <= 1000000; i++)
        if (!fr[i])
            v.push_back(i);
    fin >> t;
    for (i = 1; i <= t; i++) {
        fin >> n;
        Descompunere(n);
    }
    fin.close();
    fout.close();
    return 0;
}