Cod sursa(job #2214976)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 20 iunie 2018 17:17:00
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 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;
		}
	}
}

void calc_divizori(long long int nr) {
	int ret1 = 1, p = 0;
	long long int ret2 = 1;
	long long int aux = nr;
	long long int add;

	for (auto x : prime) {
	  if (1LL * x * x > aux)
      break;

    p = 0;
    add = 1;

    while (nr % x == 0) {
      ++ p;
      add *= x;
      nr /= x;
    }

    ret2 *= ((add * x) - 1) / (x - 1);
		ret1 *= (p + 1);
	}

	if (nr != 1) {
    ret1 *= 2;
    ret2 *= ((nr * nr) - 1) / (nr - 1);
	}

	out << ret1 << ' ' << ret2 << '\n';
}


long long int nr, t;


int main() {
	ciur();

	in >> t;

	while (t --) {
		in >> nr;
		calc_divizori(nr);

	}


  return 0;
}