Cod sursa(job #2103574)

Utilizator dragos.galeteanu2001Dragos Iulian dragos.galeteanu2001 Data 10 ianuarie 2018 15:13:05
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>
#define MOD 9901

using namespace std;

ifstream f("sumdiv.in");
ofstream g("sumdiv.out");

long long int power(long long x, int p)
{
	long long rez = 1;
	while (p) {
		if (p & 1) rez = (rez*x) % MOD;
		x = (x*x) % MOD;
		p >>= 1;
	}
	return rez;
}

void solve(long long a, long long int b)
{
	long long sum = 1;

	for (int div = 2; div * div <= a; div++) {
		if (a % div) continue;
		int pw = 0;
		while (!a % div) {
			a /= div;
			pw++;
		}
		pw *= b;
		if (!div % MOD) continue;
		if (div % MOD == 1) {
		    sum = (sum*(pw + 1)) % MOD;
		}
		else {
		    sum = (sum*(power(div, pw + 1) - 1)*(power(div - 1, MOD - 2))) % MOD;
		}
	}

	if (a != 1) {
		if (a % MOD == 1) {
		    sum = (sum*(b + 1)) % MOD;
		}
		else if (a % MOD) {
		    sum = (sum*(power(a, b + 1) - 1) * power(a - 1, MOD - 2)) % MOD;
		}
	}

	g << sum << '\n';
}

int main()
{
    int a, b;
	f >> a >> b;
	solve(a, b);
	f.close();
	g.close();
	return 0;
}