Cod sursa(job #2172413)

Utilizator zanugMatyas Gergely zanug Data 15 martie 2018 16:24:00
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

#define pb push_back
#define ll unsigned long long

using namespace std;

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

const ll PLIM = 1e6+2;
const ll MOD = 9973;

ll t, n;
ll k;
bool b[PLIM];
vector <ll> prim;
ll db[100002];

int main()
{
    for(ll i = 4; i < PLIM; i += 2)
    {
        b[i] = true;
    }
    prim.pb(2);

    for(ll i = 3; i < PLIM; i += 2)
    {
        if(!b[i])
        {
            prim.pb(i);
            for(ll j = i*2; j < PLIM; j += i)
            {
                b[j] = true;
            }
        }
    }
/*
    for(ll i = 0; i <= 10; ++i)
        cout << prim[i] << " ";
    cout << "\n";
*/
    fin >> t;

    for(ll i = 0; i < t; ++i)
    {
        fin >> n;
        if(!b[n])
        {
            fout << 2 << " " << n+1 << "\n";
            continue;
        }

        for(ll j = 0; prim[j] <= n/2; ++j)
        {
            db[j] = 1;
        }

        k = 0;
        ll sum = 1;
        ll nr = 1;
        ll nn = n;

        while(nn != 1)
        {
            if(nn % prim[k] == 0)
            {
                nn /= prim[k];
                ++db[k];
            }
            else
            {
                ++k;
            }
        }

        for(ll j = 0; prim[j] <= n/2; ++j)
        {
            nr *= db[j];
            sum *= (pow(prim[j], db[j]) - 1) / (prim[j] - 1);
            sum %= MOD;
        }

        fout << nr << " " << sum << "\n";
    }

    return 0;
}