Cod sursa(job #2312383)

Utilizator razvan1403razvan razvan1403 Data 4 ianuarie 2019 19:31:08
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#define NMAX 1000000
using namespace std;

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

int t;
long long x, numere_prime[1000005], z;
bool IsPrim[1000005];

void ciur()
{
    for (int i = 4; i <= NMAX; i += 2)
        IsPrim[i] = true;
    IsPrim[0] = true;
    IsPrim[1] = true;
    for (int i = 3; i * i <= NMAX; i += 2)
        for (int j = i * i; j <= NMAX; j += 2 * i)
            IsPrim[j] = true;
    numere_prime[++z] = 2;
    for (int i = 3; i <= NMAX; i += 2)
        if (!IsPrim[i])
            numere_prime[++z] = i;
}


int main()
{
    ciur();
    fin >> t;
    for (int i = 0; i < t; ++i)
    {
        long long x, nrdiv = 1, sumdiv = 1;
        fin >> x;
        for (int i = 1; i <= z && numere_prime[i] * numere_prime[i] <= x; ++i)
        {
            int p = 0;
            while (x % numere_prime[i] == 0)
            {
                ++p;
                x = x / numere_prime[i];
            }
            if (p)
            {
                nrdiv = nrdiv * (p + 1);
                long long numar = 1;
                for (int j = 0; j < p + 1; ++j)
                {
                    numar = numar * numere_prime[i];
                }
                sumdiv = (sumdiv * ((numar - 1) / (numere_prime[i] - 1))) % 9973;
            }
        }
        if (x > 1)
        {
            nrdiv = nrdiv * 2;
            sumdiv = (sumdiv * ((x * x - 1) / (x - 1))) % 9973;
         }
        fout << nrdiv << " " << sumdiv << "\n";
    }
    return 0;
}