Cod sursa(job #1167179)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 4 aprilie 2014 15:31:31
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <vector>

using namespace std;

typedef long long int64;

const int MOD = 9973;
const int MAX_PRIME = 1000000;

vector<int> Primes;

void Eratosthenes() {
    vector<bool> composite = vector<bool>(MAX_PRIME + 1, false);
    for (int i = 2; i <= MAX_PRIME; ++i) {
        if (!composite[i]) {
            Primes.push_back(i);
            for (int j = min(1LL * MAX_PRIME + 1, 1LL * i * i); j <= MAX_PRIME; j += i)
                composite[j] = true;
        }
    }
}

inline int Power(int value, int power) {
    int result = 1;
    for (; power > 0; power >>= 1, value = (value * value) % MOD)
        if (power & 1)
            result = (result * value) % MOD;
    return result;
}

inline int Inverse(const int value) {
    return Power(value, MOD - 2);
}

inline vector< pair<int64, int> > GetFactorization(int64 value) {
    vector< pair<int64, int> > factors;
    for (int i = 0; i < int(Primes.size()) && 1LL * Primes[i] * Primes[i] <= value; ++i) {
        int e = 0;
        for (; value % Primes[i] == 0; value /= Primes[i], ++e);
        if (e > 0)
            factors.push_back(make_pair(Primes[i], e));
    }
    if (value > 1)
        factors.push_back(make_pair(value, 1));
    return factors;
}

int main() {
    Eratosthenes();
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    int testCount;
    cin >> testCount;
    for (; testCount > 0; --testCount) {
        int64 value;
        cin >> value;
        vector< pair<int64, int> > factors = GetFactorization(value);
        int divisorCount = 1, divisorSum = 1;
        for (int i = 0; i < int(factors.size()); ++i) {
            divisorCount *= (factors[i].second + 1);
            divisorSum = (divisorSum * ((Power(factors[i].first % MOD, factors[i].second + 1) + MOD - 1) * Inverse((factors[i].first - 1) % MOD) % MOD)) % MOD;
        }
        cout << divisorCount << " " << divisorSum << "\n";
    }
    cin.close();
    cout.close();
    return 0;
}