Cod sursa(job #3302453)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 7 iulie 2025 17:11:25
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <math.h>

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

const int NMAX = 100001, VMAX = 1000001, MOD = 9973;
bool prime[VMAX];
int nrPrime[NMAX], catePrime = 0;

void ciur(int N)
{
    for (int i = 2; i * i <= N; i++)
    {
        if (prime[i] == 0)
        {
            for (int j = i * i; j <= N; j += i)
            {
                prime[j] = 1;
            }
        }
    }
    /// am calculat in vectorul prime pentru fiecare nr daca e prim sau nu
    for (int i = 2; i <= N; i++)
    {
        if (prime[i] == 0)
        {
            nrPrime[++catePrime] = i;
        }
    }
}

void ssnd(long long N)
{
    long long sumaDiv = 1, nrDiv = 1;
    for (int i = 1; 1LL * nrPrime[i] * nrPrime[i] <= N && i <= catePrime; i++)
    {
        if (N % nrPrime[i] == 0)
        {
            int exp = 0;
            long long pk = 1;
            while (N % nrPrime[i] == 0)
            {
                N /= nrPrime[i];
                exp++;
                pk *= nrPrime[i];
            }
            /// pk = nrPrime[i] ^ k
            nrDiv *= (exp + 1);
            sumaDiv = sumaDiv * (pk * nrPrime[i] - 1) / (nrPrime[i] - 1) % MOD;
        }
    }
    if (N > 1)
    {
        /// mai exista un factor prim
        /// N ^ 1, N - prim
        nrDiv *= 2;
        sumaDiv = sumaDiv * (N + 1) % MOD;
    }
    g << nrDiv << ' ' << sumaDiv << '\n';
}

int main()
{
    int T, i;
    long long n;
    f >> T;
    ciur(VMAX - 1);
    for (i = 1; i <= T; i++)
    {
        f >> n;
        ssnd(n);
    }
    return 0;
}