Cod sursa(job #2788635)

Utilizator MattiaMattia Iojica Mattia Data 26 octombrie 2021 09:54:28
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
#define mod 9973
#define ull unsigned long long

using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

vector<int>prime;
bitset<1000005>viz;

void eratostene(int n)
{
    viz[1] = 1;

    prime.push_back(2);

    for(int i = 3; i <= 1000005; i += 2)
    {
        if(viz[i] == 0)
        {
            prime.push_back(i);
            for(int j = 2 * i; j <= 1000005; j += i)
                viz[j] = 1;
        }
    }
}

ull putere(ull a, ull b)
{
    ull p = 1;

    while(b)
    {
        if(b % 2 == 1)
            p = (p * a) % mod;

        a = (a * a) % mod;
        b /= 2;
    }

    return p;
}

void nr_divizori(ull n)
{
    ull nr = 1, suma = 1;

    for(ull i = 0; i < prime.size() && 1LL * prime[i] * prime[i] <= n; i++)
    {
        if(n % prime[i])
            continue;

        ull k = 0;
        while(n % prime[i] == 0)
        {
            k++;
            n /= prime[i];
        }

        nr *= (k + 1);

        ull p1 = (putere(prime[i], k + 1) - 1) % mod;
        ull p2 = putere(prime[i] - 1, mod - 2) % mod;

        suma = (((suma * p1) % mod) * p2) % mod;

    }

    if(n > 1)
    {
        nr <<= 1;
        suma = (1LL * suma * (n + 1) % mod);
    }

    g << nr << " " << suma << '\n';

}

int main()
{
    int n;
    f >> n;

    eratostene(n);

    for(int i = 0; i < n; i++)
    {
        ull x;
        f >> x;

        nr_divizori(x);

    }


}