Cod sursa(job #2823377)

Utilizator raresgherasaRares Gherasa raresgherasa Data 28 decembrie 2021 12:35:21
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
const int mod = 9973;
const int lim = 1e6;

bitset<lim + 5>ciur;
int primes[lim + 5] , n;
long long x;

int ridica (int a , int b)
{
    int p = 1 , q = a;
    while(b)
    {
        if (b % 2 == 1)
        {
            p = ((p % mod) * (a % mod)) % mod;
        }
        b = b / 2;
        a = ((a % mod) * (a % mod)) % mod;
    }
    return ((p - 1) / (q - 1)) % mod;
}

void eratostene()
{
    int k = 0;
    for (int i=4; i<=lim; i+=2) ciur[i] = 1;
    for (int i=3; i*i<=lim; i+=2)
    {
        if (ciur[i] == 0)
        {
            for (int j=i*i; j<=lim; j+=i) ciur[j] = 1;
        }
    }
    primes[k++] = 2;
    for (int i=3; i<=lim; i+=2) if (ciur[i] == 0) primes[k++] = i;
}

void solve (long long x)
{
    long long d = 0 , p = 0 , ans = 1 , sum = 1;
    while (x > 1)
    {
        p = 0;
        while (x % primes[d] == 0) x = x / primes[d] , p++;
        if (p)
        {
            ans = ans * (p + 1);
            sum = (sum * ridica(primes[d], p + 1)) % mod;
        }

        d++;
        if (primes[d] * primes[d] > x && x > 1)
        {
            ans = ans * 2;
            sum = (sum * ridica(x , 2)) % mod;
            break;
        }
    }
    fout << ans << " " << sum << '\n';
}

int main()
{
    eratostene();
    fin >> n;
    for (int i=1; i<=n; i++)
    {
        fin >> x;
        solve(x);
    }
}