Cod sursa(job #3302451)

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

using namespace std;

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

int const mod=9973;
long long suma;
int numarul_de_divizori;
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;
    f >> N;
    for (int i = 1; 1LL * nrPrime[i] * nrPrime[i] <= N; 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,j;
    long long n;
    f>>T;
    ciur(VMAX - 1);
    for(i=1;i<=T;i++)
    {
        f>>n;
        ssnd(n);
    }
    return 0;
}