Cod sursa(job #2500190)

Utilizator radustn92Radu Stancu radustn92 Data 27 noiembrie 2019 13:44:18
Problema Suma si numarul divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
#include <bitset>
#include <vector>
using namespace std;
const int NMAX = 1005005;
const int MOD = 9973;

int tests;
bitset<NMAX> notPrime;
vector<int> primes;
long long N;

struct factorPart {
	long long factor;
	int exponent;
};

void precomputePrimes() {
	for (int i = 2; i * i < NMAX; i++) {
		if (!notPrime[i]) {
			for (int j = i * i; j < NMAX; j += i) {
				notPrime[j] = 1;
			}
		}
	}

	for (int i = 2; i < NMAX; i++) {
		if (!notPrime[i]) {
			primes.push_back(i);
		}
	}
}

vector<factorPart> decomposeNumber(long long number) {
	vector<factorPart> result;
	for (int j = 0; j < primes.size() && 1LL * primes[j] * primes[j] <= number; j++) {
		if (number % primes[j] == 0) {
			int exponent = 0;
			while (number % primes[j] == 0) {
				number /= primes[j];
				exponent++;
			}

			result.push_back({primes[j], exponent});
		}
	}

	if (number != 1) {
		result.push_back({number, 1});
	}

	return result;
}

void printDivisorsInfo(vector<factorPart> decomposition) {
	int totalSum = 1, totalDivisors = 1;
	for (factorPart fctPart : decomposition) {
		int factorPow = 1;
		for (int exp = 1; exp <= fctPart.exponent + 1; exp++) {
			factorPow = factorPow * fctPart.factor;
		}

		totalDivisors *= (fctPart.exponent + 1);

		totalSum = (totalSum * (1LL * (factorPow - 1) / (fctPart.factor - 1)) % MOD) % MOD;
	}

	printf("%d %d\n", totalDivisors, totalSum);
}

int main() {
	freopen("ssnd.in", "r", stdin);
	freopen("ssnd.out", "w", stdout);

	precomputePrimes();

	scanf("%d", &tests);
	for (int test_no = 0; test_no < tests; test_no++) {
		scanf("%lld", &N);
		vector<factorPart> decomposition = decomposeNumber(N);
		printDivisorsInfo(decomposition);
	}
	return 0;
}