Cod sursa(job #2593246)

Utilizator ZarisZaris Neamtiu Zaris Data 3 aprilie 2020 12:58:58
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <iostream>
using namespace std;

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

//long long expLog(int a, int b);
void construiestePrime(int& ind, int Prime[], bool prime[], const int N);

int main()
{
    const int Dim = 1001000;
    int ind;
    int Prime[Dim];
    bool prime[Dim] = {0};
    long long factor;

    int n, sdiv;
    long long div, nrdiv, exp;
    int indd;
    long long produs;

    construiestePrime(ind, Prime, prime, Dim);

    fin >> n;

    for(int i = 1; i <= n; ++i)
    {
        fin >> div;

        indd = 1;
        sdiv = 1;
        nrdiv = 1;

        factor = Prime[indd];

        while(div != 1)
        {
            exp = 0;
            produs = factor;

            while(div % factor == 0)
            {
                div = div / factor;
                exp++;
                produs = produs * factor;
            }

            //fout << "factor: " << factor << " exp: " << exp << '\n';

            nrdiv = nrdiv * (exp + 1);
            sdiv = (sdiv * (((produs - 1) / (factor - 1)) % 9973)) % 9973;

            if(factor * factor> div)
                factor = div;
            else
                factor = Prime[++indd];
        }

        fout << nrdiv << ' ' << sdiv << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}

/*long long expLog(int a, int b)
{
    long long r;

    if(b == 1)
        return a;

    r = expLog(a, b / 2);

    if(b % 2 == 0)
        return r * r;

    return a * r * r;
}
*/
void construiestePrime(int& ind, int Prime[], bool prime[], const int N)
{
    ind = 0;
    prime[0] = prime[1] = 1;
    for(int i = 2; i * i <= N; ++i)
        if(prime[i] == 0)
            for(int j = i * i; j <= N; j += i)
                prime[j] = 1;

    for(int i = 2; i <= N; ++i)
        if(prime[i] == 0)
            Prime[++ind] = i;

    /*for(int i = 1; i <= ind; ++i)
        fout << Prime[i] << ' ';
    fout << '\n';*/
}