Cod sursa(job #2214985)

Utilizator dahaandreiDaha Andrei Codrin dahaandrei Data 20 iunie 2018 17:32:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <vector>
#include <bitset>

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;

bitset <1000001>c;
vector <int>prime;

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

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

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

    p = 0;
    add = 1;

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

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

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

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


int t;
long long int nr;


int main() {
	ciur();

	in >> t;

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

	}


  return 0;
}