Cod sursa(job #2417337)

Utilizator GoogalAbabei Daniel Googal Data 29 aprilie 2019 15:55:28
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.9 kb

#include <fstream>

using namespace std;

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

const int MOD = 9973;
const int NMAX = 1000005;

long long t, n, r1, r2, prim[NMAX], k;
bool ciur[NMAX];

void ciur_er()
{
    long long i,j;
    for(i=2; i<NMAX; i++)
    {
        if(!ciur[i])
        {
            prim[++k]=i;
            for(j=i+i; j<=NMAX; j+=i)
                ciur[j]=true;
        }
    }
}

void inv_mod(long long &x, long long &y, long long a, long long b)
{
    if(!b)
    {
        x=1;
        y=0;
    }
    else
    {
        inv_mod(x, y, b, a%b);
        swap(x, y);
        y -= x * (a/b);
    }
}

long long turn_to_inv(long long x)
{
    long long inv = 0, ins;
    inv_mod(inv, ins, x, MOD);
    inv %= MOD;
    if(inv <= 0)
        inv = MOD + inv % MOD;
    return ((long long) inv);
}

long long effpower(long long x, long long y)
{
    if(x == 0)
        return 0;
    else if(y == 0)
        return 1;
    else
    {
        long long result = effpower(x, (y >> 1));
        if((y & 1) == 0)
            return (result * result) % MOD;
        else
            return (((result * result) % MOD) * x) % MOD;
    }
}
// nr div: (d1 + 1)*(d2 + 1)*...*(dk+1)
// sdiv :   p^(e+1)-1 /(p -1)

void decompose(long long a)
{
    long long exp = 0;
    if(a%2 == 0)
    {
        while(a%2 == 0)
        {
            a /= 2;
            exp++;
        }
        r1 *= (exp + 1);
        long long factor = effpower(2, exp + 1) - 1;
        if(factor < 0)
            factor = MOD + factor % MOD;

        r2 = (r2 * factor) % MOD;
    }

    long long j = 2;
    while(prim[j] * prim[j]<= a)
    {
        exp = 0;
        long long i = prim[j];
        while(a%i == 0)
        {
            a /= i;
            exp++;
        }
        if(0 < exp)
        {
            r1 *= (exp + 1);
            if((i-1) % MOD == 0)
            {
                r2 = (r2 * (exp+1)) % MOD;
            }
            else
            {
                long long factor = effpower(i % MOD, exp + 1) - 1;
                if(factor < 0)
                    factor = MOD + factor % MOD;

                r2 = (r2 * factor) % MOD;
                r2 = (r2 * turn_to_inv(i - 1)) % MOD;
            }
        }
        j++;
    }

    if(1 < a)
    {
        r1 *= 2;
        if((a - 1) % MOD == 0)
        {
            r2 = (r2 * (2)) % MOD;
        }
        else
        {
            long long factor = effpower(a, 2) - 1;
            if(factor < 0)
                factor = MOD + factor % MOD;
            r2 = (r2 * factor) % MOD;
            r2 = (r2 * turn_to_inv(a - 1)) % MOD;
        }
    }
}

int main()
{
    ciur_er();
    in >> t;
    for(long long i = 1; i <= t; i++)
    {
        in >> n;
        r1=r2=1;
        decompose(n);
        out << r1 << ' ' << r2 << '\n';
    }
    return 0;
}