Cod sursa(job #3220111)

Utilizator cosmin983Pascale Cosmin cosmin983 Data 2 aprilie 2024 14:30:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>


using namespace std;


ifstream cin("ssnd.in");
ofstream cout("ssnd.out");


const int NMAX = 1e6, MOD = 9973;


vector <int> primes;
int query;
bool eratosthenes[NMAX + 1];


void read() {
	cin >> query;
}


void sieve() {
	for (int index = 4; index <= NMAX; index += 2) {
		eratosthenes[index] = 1;
	}
	for (int index1 = 3; index1 * index1 <= NMAX; index1 += 2) {
		for (int index2 = index1 * index1; index2 <= NMAX; index2 += 2 * index1) {
			eratosthenes[index2] = 1;
		}
	}


	primes.push_back(2);
	for (int index = 3; index < NMAX; index += 2) {
		if (eratosthenes[index] == 0) {
			primes.push_back(index);
		}
	}
	primes.push_back(1e6 + 1);
}


void solve() {
	long long n;
	cin >> n;


	int numberOfDivisors = 1, productOfDivisors = 1;
	for (int index1 = 0; (long long)primes[index1] * primes[index1] <= n; ++index1) {
		if (n % primes[index1] != 0) {
			continue;
		}
		int power = 0;
		while (n % primes[index1] == 0) {
			n /= primes[index1];
			++power;
		}
		numberOfDivisors *= (power + 1);
		long long sum = 1, currentPower = primes[index1];
		for (int index2 = 1; index2 <= power; ++index2) {
			sum += currentPower;
			currentPower *= primes[index1];
		}
		productOfDivisors = ((long long)productOfDivisors * sum) % MOD;
	}
	if (n != 1) {
		numberOfDivisors *= 2;
		productOfDivisors = ((long long)productOfDivisors * (n + 1)) % MOD;
	}


	cout << numberOfDivisors << ' ' << productOfDivisors << '\n';
}


int main() {
	read();
	sieve();
	while (query--) {
		solve();
	}
	return 0;
}