Cod sursa(job #2384261)

Utilizator AlexandruGabrielAliciuc Alexandru AlexandruGabriel Data 20 martie 2019 15:55:34
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
#define N 1000005
#define mod 9973

using namespace std;

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

typedef unsigned long long ull;

ull t, prime[80000];
ull nr_div = 1, suma = 1, n;
bool ciur[N];

void Ciur()
{
    ciur[0] = ciur[1] = 1;
    for (int i = 4; i <= N; i += 2)
        ciur[i] = 1;
    for (int i = 3; i * i <= N; i += 2)
        if (!ciur[i])
            for (int j = i * i; j <= N; j += 2 * i)
            ciur[j] = 1;

    for (int i = 1; i <= N; i++)
        if (!ciur[i])
            prime[++prime[0]] = i;
}

ull Putere(ull p, ull pt)
{
    ull ans = 1;
    while (pt)
    {
        if (pt & 1)
        {
            ans = (ans * p) % mod;
            pt--;
        }

        p = (p * p) % mod;
        pt /= 2;
    }
    return ans % mod;
}

void Solve()
{
   nr_div = suma = 1;
   int k = 1;
   ull val = prime[k];
   while (n != 1)
   {
       if (n % val == 0)
       {
           ull ex = 0;
           while (n % val == 0)
           {
               n /= val;
               ex++;
           }

           nr_div = (nr_div * (ex + 1)) % mod;
           suma = (suma * (Putere(val, ex + 1) - 1) * Putere(val - 1, mod - 2)) % mod;
       }

       if (val * val <= n)
        val = prime[++k];
       else val = n;
   }

   fout << nr_div << " " << suma << "\n";
}

int main()
{
    Ciur();
    fin >> t;
    for (int i = 1; i <= t; i++)
    {
        fin >> n;
        Solve();
    }
    return 0;
}