Cod sursa(job #2719036)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 9 martie 2021 15:05:34
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int mod = 9973;
const long long NMax = 1e12, PrimeNrMax = 1e6;

vector <int> primenrs;

int t;
long long n, nr, sum;
bool e[PrimeNrMax + 5];

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

void Read(){
    fin >> n;
    nr = sum = 1;
}

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

void Divisors(long long x){
    for (auto i : primenrs){
        if (i * i > x)
            break;
        int p = 0;
        while (!(x % i)){
            p++;
            x /= i;
        }
        if (!p)
            continue;
        nr = nr * (p + 1);
        sum = sum * (LgPow(i, p + 1) - 1 + mod) * LgPow(i - 1, mod - 2) % mod;
    }
    if (x != 1){
        nr = nr * 2;
        sum = sum * (LgPow(x, 2) - 1 + mod) * LgPow(x - 1, mod - 2) % mod;
    }
}

void Print(){
    fout << nr << ' ' << sum << '\n';
}

int main(){
    Eratosthene();
    fin >> t;
    while (t--){
        Read();
        Divisors(n);
        Print();
    }
    return 0;
}