Cod sursa(job #2550241)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 18 februarie 2020 17:02:29
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int SQRT = 1e6;
const int MOD = 9973;

long long N;

int d[SQRT + 5];

int nrp, primes[SQRT + 5];

int nrDiv, sumaDiv;

int LgPut(long long base, int exp)
{
    int ans = 1, aux = base % MOD;

    for(int i = 1; i <= exp; i <<= 1)
    {
        if(i & exp)
            ans = (ans * aux) % MOD;

        aux = (aux * aux) % MOD;
    }

    return ans;
}

void Erathostenes()
{
    for(int i = 3; i * i <= SQRT; i += 2)
        if(!d[i])
        {
            for(int j = i * i; j <= SQRT; j += 2 * i)
                d[j] = 1;
        }

    primes[++nrp] = 2;
    for(int i = 3; i <= SQRT; i += 2)
        if(!d[i])
            primes[++nrp] = i;
}

void Push(long long div, int exp)
{
    nrDiv *= (exp + 1);

    int numarator = LgPut(div, exp + 1) - 1;
    if(numarator < 0)
        numarator += MOD;

    int numitor = LgPut(div - 1, MOD - 2);

    sumaDiv = (1LL * sumaDiv * numarator * numitor) % MOD;
}

void Solve()
{
    nrDiv = 1;
    sumaDiv = 1;

    fin >> N;

    for(int i = 1; i <= nrp; i++)
        if(1LL * primes[i] * primes[i] > N)
            break;
        else
        {
            int div = 1LL * primes[i];
            int exp = 0;

            while(N % div == 0)
            {
                N /= div;
                exp++;
            }

            Push(div, exp);
        }

    if(N != 1)
        Push(N, 1);

    fout << nrDiv << ' ' << sumaDiv << '\n';
}

int main()
{
    Erathostenes();

    int t;
    fin >> t;

    while(t--)
        Solve();

    return 0;
}