Cod sursa(job #1001033)

Utilizator tudorv96Tudor Varan tudorv96 Data 24 septembrie 2013 12:18:26
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#include <iostream>
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;
	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;
	for (int i = 3; 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 (int i = (1e6+5) / 2 + 1; i < 1e6 + 5; i += 2)
		if (!ciur[i])
			prim.push_back (i);
}

int main() {
	PreGen();
	ifstream fin ("ssnd.in");
	fin >> n;
	vector <pair <int, int> > D;
	ofstream fout ("ssnd.out");
	while (n--) {
		vector <pair <int, int> > ().swap (D);
		fin >> x;
		for (vector <int> :: iterator it = prim.begin(); 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;
				}
			}
		nd = s = 1;
		for (vector <pair <int, int> > :: iterator it = D.begin(); it != D.end(); ++it) {
			nd *= (*it).second + 1;
			s = (s * (POW ((*it).first, (*it).second + 1) - 1) * POW ((*it).first - 1, mod - 2)) % mod; 
		}
		fout << nd << " " << s << "\n";
	}
	fcloseall();
}