Cod sursa(job #1617155)

Utilizator akaprosAna Kapros akapros Data 27 februarie 2016 12:44:08
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>
#define maxN 1000002
#define mod 9973LL
#define ll long long
using namespace std;
int n, t, prime[maxN / 5];
bool w[maxN];
ll p[maxN / 5];
int d[maxN];
ll p1, p2, x;
ll lgput(ll a, ll b)
{
    if (b == 0LL)
        return 1LL;
    if (b == 1)
        return a;
    if (b % 2)
        return (1LL * a * lgput(a, b - 1)) % mod;
    else
    {
        ll aux = lgput(a, b / 2);
        return (1LL * aux * aux) % mod;
    }
}
void prime_no()
{
    int i, j;
    for (i = 2; i <= maxN; ++ i)
        if (!w[i])
        {
            prime[++ prime[0]] = i;
            if (1LL * i * i > maxN)
                continue;
            for (j = 1LL * i * i; j <= maxN; j += i)
                w[j] = 1;
        }
}
ll invm(ll x)
{
    ll y = lgput(x, mod - 2);
    return y;

}
void read()
{
    scanf("%lld", &x);
}
void get_nrd()
{
    int i;
    p1 = 1LL;
    for (i = 1; i <= p[0]; ++ i)
        p1 = (1LL * p1 * (d[i] + 1)) % mod;
}
void get_sd()
{
    int i;
    ll q = 1LL;
    p2 = 1LL;
    for (i = 1; i <= p[0]; ++ i)
    {
        q = lgput(p[i], d[i] + 1) + (mod - 1);
        if (q > mod)
            q -= mod;
        q = 1LL * q * invm(p[i] - 1);
        p2 = (q * p2) % mod;
    }
}
void solve()
{
    int i;
    d[0] = p[0] = 0;
    for (i = 1; i <= prime[0] && prime[i] * prime[i] <= x; ++ i)
        if (x % prime[i] == 0)
        {
            p[++ p[0]] = prime[i];
            d[p[0]] = 0;
            while (x % prime[i] == 0)
            {
                x /= prime[i];
                ++ d[p[0]];
            }
            if (x == 1)
                break;
        }
    if (x != 1)
        {p[++ p[0]] = x;
    d[p[0]] = 1;
    }
    get_nrd();
    get_sd();
}
void write()
{
   printf("%lld %lld\n", p1, p2);
}
int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    scanf("%d", &t);
    prime_no();

    while (t --)
    {
        read();
        solve();
        write();
    }
    return 0;
}