Cod sursa(job #1491928)

Utilizator moise_alexandruMoise Alexandru moise_alexandru Data 26 septembrie 2015 16:00:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
const int mod = 9973;

int lgput(long long n, int p)
{
    if(p == 0)
        return 1;
    n = n % mod;
    int rez = lgput(n, p/2) % mod;
    if(p % 2 == 0)
        return 1LL * rez * rez % mod;
    else
        return (1LL * rez * rez % mod) * n % mod;
}
int invers_modular(long long n)
{
    return lgput(n, mod - 2);
}
int main()
{
    int T;
    in >> T;
    for(int l = 1; l <= T; l++)
    {
        long long n;
        in >> n;
        int nrdiv = 1;
        int sumdiv = 1;
        for(int i = 2; 1LL * i * i <= n; i++)
        {
            int exp = 0;
            while(n % i == 0)
            {
                exp++;
                n = n / i;
            }
            if(exp > 0)
            {
                int aux = lgput(i, exp + 1) - 1;
                if(aux < 0)
                    aux += mod;
                sumdiv = sumdiv * (1LL * aux * invers_modular(i - 1)) % mod;
                nrdiv = nrdiv * (exp + 1);
            }
        }
        if(n != 1) {
            int aux = lgput(n, 2) - 1;
            if(aux < 0)
                aux += mod;
            sumdiv = sumdiv * (1LL * aux * invers_modular(n - 1)) % mod;
            nrdiv = nrdiv * 2;
        }
        out << nrdiv << " " << sumdiv << "\n";
    }
    return 0;
}