Cod sursa(job #2766358)

Utilizator luiz_felipeLuiz Felipe luiz_felipe Data 31 iulie 2021 20:19:45
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#define MOD 9901
using namespace std;
void ciur();
long long putere(long long a, long long b);
void sumadiv(long long p, long long q);
long long diffMOD(long long x, long long y);
int a, b;
vector<bool> isPrime(1e6 + 1, true);
vector<int> primes{ 2 };
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");

int main() {
	ciur();
	f >> a >> b;
	if (!((a || b) && b)) {
		g << 1;
		return 0;
	}
	if (!a) {
		g << 0;
		return 0;
	}
	sumadiv(a, b);
}

void ciur() {
	fill(isPrime.begin(), isPrime.begin() + 2, false);
	int i, j;
	for (i = 4; i < isPrime.size(); i += 2) isPrime[i] = false;
	for (i = 3; i < isPrime.size(); i += 2) {
		if (isPrime[i]) {
			primes.emplace_back(i);
			for (j = 3 * i; j < isPrime.size(); j += 2 * i) isPrime[j] = false;
		}
	}
}

long long putere(long long a, long long b) {
	long long result = 1;
	a %= MOD;
	for (; b; b /= 2) {
		if (b % 2) result = (result * a) % MOD;
		a = (a * a) % MOD;
	}
	return result;
}

void sumadiv(long long p, long long q) {
	long long sd = 1;
	int i, fm;
	for (i = 0; primes[i] * primes[i] <= p && i < 78498; ++i) {
		for (fm = 0; !(p % primes[i]); p /= primes[i], ++fm);
		if (fm) {
			switch (putere(primes[i], q * fm + 1)) {
			  case 1: 
				  sd = (sd * (q * fm + 1)) % MOD; 
				  break;
			  default:
				  sd = sd * diffMOD(putere(primes[i], q * fm + 1), 1) % MOD * putere(diffMOD(primes[i], 1), MOD - 2) % MOD;
				  break;
			}
		}
	}
	if (p != 1) {
		if (p % MOD == 1)
			sd = (sd * (q + 1)) % MOD;
		else
			sd = sd * diffMOD(putere(p, q + 1), 1) % MOD * putere(diffMOD(p, 1), MOD - 2) % MOD;
	}
	g << sd << '\n';
}

long long diffMOD(long long x, long long y) {
	return ((x - y) % MOD + MOD) % MOD;
}