Cod sursa(job #2214966)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 20 iunie 2018 16:54:54
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <vector>

using namespace std;

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

const long long int MAXN = 1e12;
const int MAXT = 1e3;
const int MOD = 9973;

bool c[1000001];
vector <int>prime;

void ciur() {
	c[0] = c[1] = 1;
	for (int i = 4; i <= 1000000; i += 2) {
		c[i] = 1;
	}
  prime.push_back(2);

	for (int i = 3; i <= 1000000; i += 2) {
		if (!c[i]) {
			prime.push_back(i);
			for (long long int j = 1LL * i * i; j <= 1000000; j += 2 * i)
				c[j] = 1;
		}
	}
}

int calc_divizori(long long int nr) {
	int ret = 1, p = 0;
	long long int aux = nr;

	for (auto x : prime) {
    if (x * x > aux)
      break;
		p = 0;
		int divizor = x;
		while (nr % x == 0) {
			++ p;
			nr /= x;
		}
		ret *= (p + 1);
	}

	if (nr != 1) {
    ret = 2;
	}

	return ret;
}

int calc_sum(long long int nr) {
	long long int ret = 1;
	long long int p;
	long long int aux = nr;

	for (auto x : prime) {
    if (x * x > aux)
      break;
		if (nr % x == 0) {
			p = 1;
			while (nr % x == 0) {
				p *= x;
				nr /= x;
			}
			ret *= ((p * 1LL * x) - 1) / (1LL * x - 1);
		}
	}

	if (nr != 1) {
    ret = (nr * nr - 1) / (nr - 1);
	}

	return ret % MOD;
}


long long int nr, t;


int main() {
	ciur();

	in >> t;

	while (t --) {
		in >> nr;
		out << calc_divizori(nr) << ' ' << calc_sum(nr) << '\n';

	}


  return 0;
}