Cod sursa(job #2563895)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 1 martie 2020 15:51:31
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int Primemax = 1000000, mod = 9973;

vector <int> primenrs;
vector <pair <long long, int>> divs;
int t;
long long n;
bool e[Primemax + 5];

void Eratostene(){
    for (int i = 2; i <= Primemax; i++)
        if (!e[i]){
            for (int j = 2 * i; j <= Primemax; j += i)
                e[j] = 1;
            primenrs.push_back(i);
        }
}

void Divisors(){
    for (auto d : primenrs){
        if (d * d > n)
            break;
        int power = 0;
        while (!(n % d)){
            power++;
            n /= d;
        }
        if (power)
            divs.push_back({d, power});
    }
    if (n > 1)
        divs.push_back({n, 1});
}

long long Number(){
    int nr = 1;
    for (auto i : divs)
        nr *= i.second + 1;
    return nr;
}

int LogPower(long long n, int p){
    int ans = 1;
    n %= mod;
    while (p){
        if (p % 2)
            ans = ans * n % mod;
        n = n * n % mod;
        p /= 2;
    }
    return ans;
}

int Sum(){
    long long ans = 1;
    for (auto i : divs){
        long long d = i.first;
        int p = i.second;
        long long x1 = LogPower(d, p + 1);
        x1--;
        if (x1 < 0)
            x1 += mod;
        long long x2 = LogPower(d - 1, mod - 2);
        ans = ans * x1 * x2 % mod;
    }
    return ans;
}

int main(){
    fin >> t;
    Eratostene();
    while (t--){
        fin >> n;
        Divisors();
        fout << Number() << ' ' << Sum() << '\n';
        divs.clear();
    }
    return 0;
}