Cod sursa(job #2378931)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 12 martie 2019 19:09:38
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>

#define input "ssnd.in"
#define output "ssnd.out"
#define ERAS_MAX 1000000
#define MOD 9973

using namespace std;
typedef long long ll;

ifstream in(input);
ofstream out(output);

struct power
{
	ll nr, exp;
};

vector < ll > primes;
int Tests;
bool erastostene[ERAS_MAX + 5];

void Ciur()
{
	primes.push_back(2);
	for (int i = 3; i <= ERAS_MAX; i += 2)
		if (!erastostene[i])
		{
			primes.push_back(i);
			for (int j = 3 * i; j <= ERAS_MAX; j += 2 * i)
				erastostene[j] = 1;
		}
}

ll fast_exp(ll base, ll exp)
{
	if (!exp) return 1;
	if (exp == 1) return base % MOD;
	if (exp % 2) return base * fast_exp(base, exp - 1) % MOD;
	return fast_exp(base * base % MOD, exp / 2) % MOD;
}

void Solve(ll number)
{
	vector < power > powers;
	unsigned pivot = 0;
	int p = 0;
	while (number != 1)
	{
		while (number % primes[pivot] == 0) number /= primes[pivot], p++;
		powers.push_back({ primes[pivot], p });
		p = 0, pivot++;
	}
	// Parcurg descompunerea in factori primi
	ll nr_div = 1, suma_div = 1;
	for (unsigned i = 0; i < powers.size(); i++)
	{
		ll prim = powers[i].nr, expo = powers[i].exp;
		ll numarator = (fast_exp(prim, expo + 1) - 1) % MOD;
		ll numitor = (prim - 1) % MOD;
		nr_div = (nr_div * (expo + 1)) % MOD;
		suma_div = suma_div * numarator % MOD / numitor % MOD;
	}
	out << nr_div << " " << suma_div << "\n";
}

void Read_Data()
{
	in >> Tests;
	while (Tests--)
	{
		ll number; in >> number;
		Solve(number);
	}
}


int main()
{
	Ciur();
	Read_Data();
	return 0;
}