Cod sursa(job #2379197)

Utilizator sansRotaru Razvan Andrei sans Data 13 martie 2019 08:20:46
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 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);

long long primes[ERAS_MAX + 5];
int Tests;
bool erastostene[ERAS_MAX + 5];

void Ciur()
{
	int pivot = 0;
	primes[++pivot] = 2;
	for (int i = 3; i <= ERAS_MAX; i += 2)
		if (!erastostene[i])
		{
			primes[++pivot] = 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;
	if (exp % 2) return base * fast_exp(base, exp - 1);
	return fast_exp(base * base, exp / 2);
}

void Solve(ll number)
{
	int pivot = 1;
	int p = 0;
	ll nr_div = 1, suma_div = 1;
	for (int pivot = 1; 1LL * primes[pivot] * primes[pivot] <= number; pivot++)
		if (number % primes[pivot] == 0)
		{
			while (number % primes[pivot] == 0) number /= primes[pivot], p++;
			ll prim = primes[pivot], expo = p;
			//out << prim << " " << expo << " -> ";
			ll numarator = (fast_exp(prim, expo + 1) - 1);
			ll numitor = (prim - 1);
			//out << numarator << " " << numitor << "\n";
			nr_div = (nr_div * (expo + 1)) % MOD;
			suma_div = (suma_div * numarator / numitor) % MOD;
			p = 0;
		}
	if (number > 1)
	{
		nr_div = nr_div * 2 % MOD;
		ll numarator = (number * number - 1);
		ll numitor = (number - 1);
		suma_div = (suma_div * numarator / numitor) % MOD;
	}
	out << nr_div << " " << suma_div << "\n";
	//out << "\n";
}

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


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