Cod sursa(job #2582531)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 16 martie 2020 20:59:09
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

long long ridicare(long long baza, long long exponent)
{
    long long putere = 1;

    while(exponent)
    {
        if(exponent % 2)putere *= baza;

        baza *= baza;
        exponent /= 2;
    }

    return putere;
}

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

    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    srand(time(NULL));

    int t;

    fin >> t;

    for(int i = 1; i <= t; i++)
    {
        long long n;

        fin >> n;

        long long d = 2, nrDiv = 1, sumaDiv = 1;

        while(d * d <= n)
        {
            if(n % d == 0)
            {
                int nrAp = 0;

                while(n % d == 0)
                {
                    nrAp++;
                    n /= d;
                }

                nrDiv *= (nrAp + 1);
                sumaDiv *= ((ridicare(d, nrAp + 1) - 1) / (d - 1));
            }

            d++;
        }

        if(n > 1)
        {
            nrDiv *= 2;
            sumaDiv *= (n * n - 1) / (n - 1);
        }

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

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

    return 0;
}