Cod sursa(job #1001071)

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

const int mod = 9901;
int a, b;
long long s = 1;

vector <pair <long long, long long> > D;
vector <int> prim;
vector <bool> phi (1e5+5);

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

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 (i & b)
			sol = (sol * tmp) % mod;
		tmp = (tmp * tmp) % mod;
	}
	return sol;
}	

int main() {
	ifstream fin ("sumdiv.in");
	PreGen();
	fin >> a >> b;
	fin.close();
	long long aux = a;
	for (vector <int> :: iterator it = prim.begin(); a != 1 && *it <= a && it != prim.end(); ++it) {
		if (a % *it == 0) {
			D.push_back (make_pair (*it, 0));
			while (a % *it == 0) {
				D.back().second += b;
				a /= *it;
			}
			if (a < 1e5 + 5 && phi[a])
				break;
		}
	}
	if (D.empty())
		D.push_back (make_pair (aux, 1));
	else
		if (a > 1)
			D.push_back (make_pair (a, 1));
	for (vector <pair <long long, long long> > :: iterator it = D.begin(); it != D.end(); ++it) {
		s = (s * (POW ((*it).first, (*it).second + 1) - 1)) % mod;
		s = (s * (POW ((*it).first - 1, mod - 2))) % mod;
	}
	ofstream fout ("sumdiv.out");
	if (s < 0)
		s += mod;
	fout << s;
	fout.close();
}