Cod sursa(job #2191502)

Utilizator TudoseSanzianaTudose Sanziana TudoseSanziana Data 2 aprilie 2018 21:46:24
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 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++)
        {
            int p = 0;
            while(n % primes[i] == 0)
            {
                n /= primes[i];
                p++;
            }

            numDivs = (1LL * numDivs * (p + 1)) % MOD;
            sumDivs = (1LL * sumDivs * (exp(primes[i], p + 1) - 1) * exp(primes[i] - 1, MOD - 2)) % MOD;
        }

        if(n != 1)
        {
            numDivs = (1LL * 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)
{
    int ans;
    for(ans = 1; b; b >>= 1)
    {
        if(b & 1)
            ans = (ans * a) % MOD;
        a = (a * a) % MOD;
    }

    return ans;
}