Cod sursa(job #2191506)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 2 aprilie 2018 21:58:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
using namespace std;

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

const int LIM = 1e6, MOD = 9973;

int t;
long long n;

int sumDivs, numDivs;

bool c[LIM + 2];
vector<int> primes;
void ciur();

int exp(int a, int b);

int main()
{
    ciur();

    in >> t;
    while(t--)
    {
        numDivs = sumDivs = 1;

        in >> n;
        for(int i = 0; 1LL * primes[i] * primes[i] <= n; i++)
        {
            if(n % primes[i])
                continue;

            int p = 0;
            while(n % primes[i] == 0)
            {
                n /= primes[i];
                p++;
            }

            int ans1 = (exp(primes[i], p + 1) - 1) % MOD;
            int ans2 = exp(primes[i] - 1, MOD - 2) % MOD;

            numDivs = (numDivs * (p + 1)) % MOD;
            sumDivs = ((sumDivs * ans1) % MOD * ans2) % MOD;
        }

        if(n != 1)
        {
            numDivs = (numDivs * 2) % MOD;
            sumDivs = (1LL * sumDivs * (n + 1)) % MOD;
        }

        out << numDivs << ' ' << sumDivs << '\n';
    }

    return 0;
}

void ciur()
{
    c[0] = c[1] = true;
    for(int i = 4; i <= LIM; i += 2)
        c[i] = true;

    for(int i = 3; i * i <= LIM; i += 2)
        if(!c[i])
            for(int j = i * i; j <= LIM; j += 2 * i)
                c[j] = true;

    for(int i = 2; i <= LIM; i++)
        if(!c[i])
            primes.push_back(i);
}

int exp(int a, int b)
{
    a %= MOD;

    int ans;
    for(ans = 1; b; b >>= 1)
    {
        if(b & 1)
            ans = (ans * a) % MOD;
        a = (a * a) % MOD;
    }

    return ans;
}