Cod sursa(job #2461291)

Utilizator davidcotigacotiga david davidcotiga Data 25 septembrie 2019 12:27:03
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <cmath>

using namespace std;

const int maxCiur = 50000;
const int maxPrime = 5140;

bool ciur[maxCiur];
int prime[maxPrime];

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

void prelucrareCiur() {
	ciur[0] = 1;
	ciur[1] = 1;
	int i;
	for (i = 2; i <= sqrt(maxCiur); ++i)
		if (!ciur[i])
			for (int j = i; j * i < maxCiur; ++j)
				ciur[i * j] = 1;
	int k = 0;
	for (int i = 0; i < maxCiur && k < maxPrime; ++i)
		if (!ciur[i]) {
			prime[k] = i;
			++k;
		}
}

//aflam nr de divizori si suma acestora

void divizori(unsigned long long n, long long& rez, long long& suma) {
	int p;
	for (int d = 0; prime[d] != 0 && n > 1; ++d) {
		p = 0;
		while (n % prime[d] == 0) {
			++p;
			n /= prime[d];
		}
		if (p) {
			rez *= p + 1;
			suma *= 1LL * ((pow(prime[d], p + 1) - 1) / (prime[d] - 1));
			suma %= 9973;
		}
	}
		 if (n > 1){
            rez *= 2;
            suma = (1LL * suma * (n + 1)) % 9973;
		 }
}

int main() {
	prelucrareCiur();
	int t;
	unsigned long long n;
	cin >> t;
	for (int i = 0; i < t; ++i) {
		cin >> n;
		long long suma = 1;
		long long rez = 1;
		divizori(n, rez, suma);
		cout << rez << " " << suma << "\n";
	}

	return 0;
}