Cod sursa(job #1137326)

Utilizator japjappedulapPotra Vlad japjappedulap Data 9 martie 2014 12:39:45
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define MOD 9973
using namespace std;

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

long long n;
int T;
bool P[1000005];

vector <int> Prim;

int LgPow(int A, int B);
void Solve();
void Sieve();

int main()
{
    is >> T;
    Sieve();
    for (int t = 0; t < T; ++t)
        Solve();
    is.close();
    os.close();
    return 0;
}

void Solve()
{
    is >> n;
    if (binary_search(Prim.begin(), Prim.end(), n) == true)
    {
        os << 2 << ' ' << (n+1) % MOD << '\n';
        return;
    }
    int p, r1, r2, x, ND = 1, SD = 1;
    for (int i = 0; i < Prim.size() && 1LL * Prim[i] * Prim[i] <= n; ++i)
    {
        if (n % Prim[i] == 0)
        {
            p = 0;
            for (; n % Prim[i] == 0; ++p)
                n /= Prim[i];
            ND *= (p+1);
            r1 = (LgPow(Prim[i], p+1)-1) % MOD;
            r2 = LgPow(Prim[i]-1, MOD-2) % MOD;
            SD = (1LL * SD * r1 * r2) % MOD;
        }
    }
    if (n > 1)
        ND *= 2, SD = (SD * (n+1)) % MOD;
    os << ND << ' ' << SD%MOD << '\n';
};

int LgPow(int A, int B)
{
    if (B == 0) return 1;
    if (B % 2 == 0) return LgPow((1LL*A*A)%MOD, B/2) % MOD;
    if (B % 2 == 1) return (1LL*A*LgPow((1LL*A*A)%MOD, B/2)) % MOD;
};

void Sieve()
{
    for (int i = 2; i <= 1000004; ++i)
        if (P[i] == 0)
        {
            Prim.push_back(i);
            for (int j = i+i; j <= 1000004; j+=i)
                P[j] = 1;
        }
};