Cod sursa(job #1001069)

Utilizator tudorv96Tudor Varan tudorv96 Data 24 septembrie 2013 13:37:44
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include <vector>
using namespace std;

const int mod = 9973;
int n;
long long x, s, nd;

vector <bool> ciur (1e6+5);
vector <int> prim;

long long POW (long long a, long long b) {
	long long sol = 1, tmp = a % mod;
	for (long long i = 1; i <= b; i <<= 1) {
		if (b & i)
			sol = (sol * tmp) % mod;
		tmp = (tmp * tmp) % mod;
	}
	return sol;
}

void PreGen() {
	prim.push_back (2);
	for (int i = 4; i < 1e6+5; i += 2)
		ciur[i] = 1;
	int i = 3;
	for (; i < (1e6+5) / 2; i += 2)
		if (!ciur[i]) {
			for (int j = i * 2; j < 1e6 + 5; j += i)
				ciur[j] = 1;
			prim.push_back (i);
		}
	for (; i < 1e6 + 5; i += 2)
		if (!ciur[i])
			prim.push_back (i);
}

int main() {
	PreGen();
	ifstream fin ("ssnd.in");
	fin >> n;
	vector <pair <long long, long long> > D;
	ofstream fout ("ssnd.out");
	while (n--) {
		vector <pair <long long, long long> > ().swap (D);
		fin >> x;
		long long aux = x;
		for (vector <int> :: iterator it = prim.begin(); *it <= x && it != prim.end() && x != 1; ++it) {
			if (x % *it == 0) {
				D.push_back (make_pair (*it, 0));
				while (x % *it == 0) {
					D.back().second++;
					x /= *it;
				}
			}
			if (x < 1e6 + 5 && !ciur[x])
				break;
		}
		if (D.empty())
			D.push_back (make_pair (aux, 1));
		else
			if (x > 1)
				D.push_back (make_pair (x, 1));
		nd = s = 1;
		for (vector <pair <long long, long long> > :: iterator it = D.begin(); it != D.end(); ++it) {
			nd *= (*it).second + 1;
			s = (s * (POW ((*it).first, (*it).second + 1) - 1)) % mod;
			s = (s * POW ((*it).first - 1, mod - 2)) % mod;
		}
		if (s < 0)
			s += mod;
		fout << nd << " " << s << "\n";
	}
	fcloseall();
}