Cod sursa(job #2369154)

Utilizator RussianSmoothCriminalRodion Raskolnikov RussianSmoothCriminal Data 5 martie 2019 21:27:52
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 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[100000], 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;
}

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

void Query (ll x)
{
    ll 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);
            nrdiv = nrdiv * e;
        }
        i++;
    }
    if (x > 1)
    {
        nrdiv *= 2;
        sumdiv = sumdiv * (lgput(x, 2) - 1) / (x - 1);
    }
    fout << nrdiv << " " << sumdiv % mod << "\n";
}

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

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