Cod sursa(job #1591235)

Utilizator raducostacheRadu Costache raducostache Data 5 februarie 2016 22:04:51
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <bitset>

#define LL long long
#define NMAX 1000005
#define mod 9973
using namespace std;

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


int nr, sum;
int t, k, p;
LL n;
bitset<NMAX> nprim;
int v[NMAX >> 3];

void ciur()
{
    nprim[1] = 1;
    for (int i = 2; i < NMAX; ++i)
        if (!nprim[i])
        {
            v[++k] = i;
            for (int j = i+i; j < NMAX; j += i)
                nprim[j] = 1;
        }
}

int exp(int x, int a)
{
    if (x == 0) return 0;
    if (x == 1) return 1;

    int rez = 1;
    x %= mod;
    for (int i = 0; (1<<i) <= a; ++i)
    {
        if (a & (1<<i))
            rez = (rez * x) % mod;
        x = (x * x) % mod;
    }
    return rez;
}
int main()
{
    int cn;
    ciur();

    fin >> t;
    while (t--)
    {
        fin >> n;
        nr = 1; sum = 1;
        for (int i = 1; (i <= k) && (v[i] * v[i] <= n); ++i)
        {
            p = 0;
            while (n % v[i] == 0)
            {
                ++p;
                n /= v[i];
            }
            nr = nr * (p+1);
            if (p) sum = (((sum * (exp(v[i], p+1) - 1)) % mod) * exp(v[i] - 1, mod - 2)) % mod;
        }
        if (n > 1)
        {
            nr *= 2;
            sum = (sum * (n + 1)) % mod;
        }
        fout << nr << ' ' << sum << '\n';
    }

    return 0;
}