Cod sursa(job #2368821)

Utilizator RussianSmoothCriminalRodion Raskolnikov RussianSmoothCriminal Data 5 martie 2019 18:27:33
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <iostream>
#include <bitset>
using namespace std;

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

typedef long long ll;
const int nmax = 1000000, mod = 9973;
int a[80000], x, t, k;
bitset <nmax + 2> sieve;

void CreateSieve ()
{
    int i, j;
    sieve[0] = sieve[1] = 1;
    for (i = 4; i <= nmax; i += 2)
        sieve[i] = 1;
    for (i = 3; i * i <= nmax; i += 2)
        if (!sieve[i])
            for (j = i * i; j <= nmax; j += 2 * i)
                sieve[j] = 1;
    k = 1;
    a[1] = 2;
    for (i = 3; i <= nmax; i += 2)
        if (!sieve[i]) a[++k] = i;
}

int lgput (ll a, int b)
{
    int p = 1;
    for (; b; b >>= 1)
    {
        if (b & 1) p = 1LL * p * a % mod;
        a = 1LL * a * a % mod;
    }
    return p;
}

void Query (ll x)
{
    int nrdiv = 1, sumdiv = 1, i = 1;
    while (a[i] * a[i] <= x && x > 1)
    {
        if (x % a[i] == 0)
        {
            int e = 0;
            while (x % a[i] == 0)
            {
                e++;
                x /= a[i];
            }
            e++;
            sumdiv = sumdiv * ((lgput(a[i], e)) - 1) / (a[i] - 1) % mod;
            nrdiv = nrdiv * e;
        }
        i++;
    }
    if (x > 1)
    {
        nrdiv *= 2;
        sumdiv = sumdiv * ((lgput(x, 2)) - 1) / (x - 1) % mod;
    }
    fout << nrdiv << " " << sumdiv << "\n";
}

void Solve ()
{
    ll x;
    fin >> t;
    while (t--)
    {
        fin >> x;
        Query(x);
    }
    fout.close();
}

int main()
{
    CreateSieve();
    Solve();
    return 0;
}