Cod sursa(job #2384529)

Utilizator dey44andIoja Andrei-Iosif dey44and Data 20 martie 2019 20:33:58
Problema Suma divizorilor Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>

#define input "sumdiv.in"
#define output "sumdiv.out"
#define MOD 9901
#define NMAX 100000

using namespace std;
typedef long long ll;

ifstream in(input);
ofstream out(output);

struct factor_prim
{
	ll base, exp;
};
vector < factor_prim > des;
vector < ll > erastostene;
ll A, B;

void Ciur()
{
	bool *eras = new bool[NMAX+5];
	erastostene.push_back(2);
	for (int i = 3; i <= NMAX; i += 2)
		if (eras[i])
		{
			erastostene.push_back(i);
			for (int j = 3 * i; j <= NMAX; j += 2 * i)
				eras[j] = 0;
		}
	delete eras;
}

void Read_Data()
{
	in >> A >> B;
}

void Descompunere(ll number)
{
	long long power = 0, p = 0;
	for (p = 0; erastostene[p] * erastostene[p] <= number && number != 1; p++)
		if (number % erastostene[p]== 0)
		{
			while (number % erastostene[p] == 0) number /= erastostene[p], power++;
			des.push_back({ erastostene[p], power * B });
			//out << erastostene[p] << " " << power << "\n";
			power = 0;
		}
	if (number != 1)
	{
		des.push_back({ number, B });
		//out << erastostene[p] << " " << power << "\n";
		power = 0;
	}
}

ll fast_exp(ll base, ll exp)
{
	if (!exp) return 1;
	if (exp == 1) return base % MOD;
	if (exp % 2) return base * fast_exp(base, exp - 1) % MOD;
	return fast_exp(base * base % MOD, exp / 2) % MOD;
}

void Solve()
{
	ll solution = 1;
	for (unsigned i = 0; i < des.size(); i++)
	{
		ll baza = des[i].base, exp = des[i].exp;
		//out << baza << " " << exp << "\n";
		ll numarator = (fast_exp(baza, exp + 1) % MOD - 1 + MOD) % MOD;
		ll numitor = fast_exp(baza - 1, MOD - 2) % MOD;
		solution = solution * numarator % MOD * numitor % MOD;
	}
	out << solution;
}

int main()
{
	Ciur();
	Read_Data();
	Descompunere(A);
	Solve();
	return 0;
}