Cod sursa(job #2592952)

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

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

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

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

    unsigned long long n, div, sdiv, nrdiv, exp;

    unsigned long long indd;

    construiestePrime(ind, Prime, prime, Dim);

    fin >> n;

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

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

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

            while(div % Prime[indd] == 0)
            {
                div = div / Prime[indd];
                exp++;
            }

            nrdiv = nrdiv * (exp + 1);
            sdiv = ((sdiv % 9973) * (((expLog(Prime[indd], exp + 1) - 1) / (Prime[indd] - 1)) % 9973)) % 9973;

            indd++;
        }

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

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

    return 0;
}

unsigned long long expLog(unsigned long long a, unsigned long long b)
{
    if(b == 1)
        return a;

    else if(b % 2 == 0)
        return expLog(a * a, b / 2);

    return a * expLog(a * a, b / 2);
}

void construiestePrime(unsigned long long& ind, unsigned long long Prime[], bool prime[], const int N)
{
    ind = 0;

    for(long long i = 2; i * i <= N; ++i)
        if(prime[i] == 0)
            for(long long j = i * i; j <= N; j += i)
                prime[j] = 1;

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

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