Cod sursa(job #2418409)

Utilizator SemetgTemes George Semetg Data 4 mai 2019 21:19:55
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

const string FILE_NAME = "ssnd";
const int VAL_MAX { 1000005 };
const int MOD { 9973 };

ifstream in { FILE_NAME + ".in" };
ofstream out { FILE_NAME + ".out" };

int64_t T, N;
vector<int> primes;
int64_t noD, sumD;

void init() {
    in >> T;
    
    vector<bool> ciur(VAL_MAX, true);
    for (int i { 2 }; i < VAL_MAX; ++i)
        if (ciur[i]) {
            primes.push_back(i);
            
            for (int j { i * i }; j < VAL_MAX; j += i)
                ciur[j] = false;
        }
}

int64_t pow(int b, int e) {
    int64_t sol { 1 };
    
    for (; e; e /= 2, b = b * b % MOD)
        if (e % 2 == 1)
            sol = sol * b % MOD;
    
    return sol;
}

void solve() {
    in >> N;
    
    noD = sumD = 1;
    for (int i { 0 }; i < int(primes.size()) && 1LL * primes[i] * primes[i] <= N; ++i) {
        if (N % primes[i])
            continue;
        
        int b { primes[i] }, e { 0 };
        while (N % b == 0) {
            ++e;
            N /= b;
        }
        
        noD *= e + 1;
        sumD *= (((1LL * pow(b, e + 1) - 1) % MOD) * pow(b - 1, MOD - 2)) % MOD;
        sumD %= MOD;
    }
    
    if (N != 1) {
        noD *= 2;
        sumD *= (((1LL * pow(N, 2) - 1) % MOD) * pow(N - 1, MOD - 2)) % MOD;
        sumD %= MOD;
    }
}

void print() {
    out << noD << ' ' << sumD << '\n';
}

int main() {
    init();
    
    while (T--) {
        solve();
        print();
    }
}