Cod sursa(job #2377777)

Utilizator HerddexJinga Tudor Herddex Data 11 martie 2019 09:18:42
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int prime_numbers[80000];
int nr_primes = 0;

struct prime_factor {
    int factor;
    int exponent;
}factors[80000];
int nr_factors;

void calculate_prime_factors_of(long long n) {
    nr_factors = 0;
    for(int i = 1, d = prime_numbers[1]; d * d <=n; d = prime_numbers[++i]) {
        if(n % d == 0) {
            factors[++nr_factors].factor = d;
            factors[nr_factors].exponent = 0;
            while(n % d == 0) {
                n /= d;
                factors[nr_factors].exponent++;
            }
        }
    }
    if(n != 1) {
        factors[++nr_factors].factor = n;
        factors[nr_factors].exponent = 1;
    }
}

void calculate_primes() {
    bool *is_prime = new bool[1000001];
    for(int i = 2; i <= 1000000; i++)
        is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;

    for(int i = 2; i <= 1000; i++)
        if(is_prime[i])
            for(int j = i * i; j <= 1000000; j += i)
                is_prime[j] = false;

    for(int i = 2; i <= 1000000; i++)
        if(is_prime[i])
            prime_numbers[++nr_primes] = i;
    delete is_prime;
}

long long power_function(int base, int exponent) {
    long long result = 1;
    for(; exponent; exponent--)
        result *= base;
    return result;
}

int main()
{
    calculate_primes();
    int t;
    fin >> t;
    for(; t; t--) {
        long long n;
        fin >> n;
        calculate_prime_factors_of(n);

        int nr_of_divisors = 1;
        for(int i = 1; i <= nr_factors; i++)
            nr_of_divisors *= factors[i].exponent + 1;

        int sum_of_divisors = 1;
        for(int i = 1; i <= nr_factors; i++) {
            sum_of_divisors *= (power_function(factors[i].factor, factors[i].exponent + 1) - 1) / (factors[i].factor - 1) % 9973;
            sum_of_divisors %= 9973;
        }

        fout << nr_of_divisors << ' ' << sum_of_divisors << '\n';
    }

	fin.close();
	fout.close();
	return 0;
}