Cod sursa(job #2343996)

Utilizator marius0072scarlat marius stefan marius0072 Data 14 februarie 2019 17:25:15
Problema Suma divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<fstream>
#include<bitset>

using namespace std;

ifstream cin("sumdiv.in");
ofstream cout("sumdiv.out");

unsigned long long n, NR, POWER;
const int MODULO = 9901;
const int MAX_N = 71e2+5;
int T, K, P[MAX_N];
bitset <MAX_N> viz;

void Sieve()
{
	for (int i = 2; i < MAX_N; ++i) {
		if (viz[i] == 0) {
			P[++K] = i;

			for (int j = i + i; j < MAX_N; j += i) {
				viz[j] = 1;
			}
		}
	}
}

inline unsigned long long power(unsigned long long n, unsigned long long p)
{
	unsigned long long r = 1;
	while (p)
	{
		if (p % 2 == 1)
			r = (1ULL * (r% MODULO)*(n%MODULO)) % MODULO;
		p /= 2;
		n = (1ULL * (n%MODULO) *(n%MODULO)) % MODULO;
	}
	return r;
}
void Solve(unsigned long long N) {
	unsigned long long nd = 1, sd = 1;
	for (int i = 1; i <= K && 1LL * P[i] * P[i] <= N; ++i) {
		if (N % P[i]) continue;
		int p = 0;
		while (N % P[i] == 0) {
			N /= P[i];
			++p;
		}
		nd *= (p + 1);
		unsigned long long p1 = (power(P[i], p + 1) - 1) % MODULO;
		unsigned long long p2 = power(P[i] - 1, MODULO - 2) % MODULO;
		sd = (((sd * p1) % MODULO) * p2) % MODULO;
	}
	if (N > 1) {
		nd *= 2;
		sd = (1LL * sd*(N + 1) % MODULO);
	}
	cout << sd << "\n";
}
int main()
{
	Sieve();
	cin >> NR >> POWER;
	n = power(NR, POWER);
	Solve(n);
	cin.close();
	cout.close();
	return 0;
}