Cod sursa(job #2224718)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 24 iulie 2018 21:04:58
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;

const string IN_FILE = "ssnd.in";
const string OUT_FILE = "ssnd.out";
const int MOD = 9973;
const int MAX_PRIME = 1000000;

struct Factor {
    int64_t value, p;
    int a;
};

vector<int> generatePrimes(const int n) {
    auto isPrime = vector<bool>(n + 1, true);
    auto primes = vector<int>({2});
    for (int i = 3; i <= n; i += 2) {
        if (!isPrime[i]) continue;
        primes.push_back(i);
        for (int j = int(min(1LL * i * i, 1LL * n + 1)); j <= n; j += i) {
            isPrime[j] = false;
        }
    }
    return primes;
}

vector<Factor> factorize(const vector<int>& primes, const int64_t n) {
    auto factors = vector<Factor>();
    int64_t x = n;
    const int limit = int(primes.size());
    for (int i = 0; i < limit && 1LL * primes[i] * primes[i] <= x; i++) {
        const int p = primes[i];
        if (x % p == 0) {
            int64_t value = 1;
            int a = 0;
            for (; x % p == 0; x /= p, value *= p, a++);
            factors.push_back({value, p, a});
        }
    }
    if (x > 1) {
        factors.push_back({x, x, 1});
    }
    return factors;
}

int countDivisors(const vector<Factor>& factors) {
    int count = 1;
    for (const auto& f : factors) {
        count *= (f.a + 1);
    }
    return count;
}

int sumDivisors(const vector<Factor>& factors) {
    int sum = 1;
    for (const auto& f : factors) {
        sum = (1LL * sum * ((1LL * f.value * f.p - 1) / (f.p - 1))) % MOD;
    }
    return sum;
}

int main() {
    ifstream in(IN_FILE);
    ofstream out(OUT_FILE);
    const auto primes = generatePrimes(MAX_PRIME);
    int t;
    in >> t;
    for (int i = 0; i < t; i++) {
        int64_t n;
        in >> n;
        const auto factors = factorize(primes, n);
        out << countDivisors(factors) << " " << sumDivisors(factors) << "\n";
    }
    in.close();
    out.close();
    return 0;
}