Cod sursa(job #2593986)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 5 aprilie 2020 02:39:03
Problema Suma divizorilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <fstream>

using namespace std;

const int MOD = 9901;

long long lgput(long long a, long long b)
{
	long long r = 1;
	a %= MOD;
	while (b)
	{
		if (b & 1LL)
		{
			--b;
			r *= a;
			r %= MOD;
		}
		else
		{
			b >>= 1LL;
			a *= a;
			a %= MOD;
		}
	}
	return r;
}

long long a, b, r, p, d, t1, t2;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

int main()
{
	r = 1;

	fin >> a >> b;

	while ((a & 1LL) == 0)
	{
		d += b;
		a >>= 1LL;
	}

	if (d) 
	{
		++d;

		r = (lgput(2, d) - 1) % MOD;
	}

	p = 3;

	while (a > 1 && p * p <= a)
	{
		d = 0;
		while (a % p == 0)
		{
			a /= p;
			d += b;
		}
		if (d)
		{
			++d;
			t1 = (lgput(p, d) - 1 + MOD) % MOD;
			t2 = lgput(p - 1, MOD - 2);
			r = (((r * t1) % MOD) * t2) % MOD;
		}
		p += 2;
	}

	if (a > 1)
	{
		t1 = (lgput(a, b + 1) + MOD - 1) % MOD;
		t2 = lgput(a - 1, MOD - 2);


		r = (((r * t1) % MOD) * t2) % MOD;
	}

	fout << r << "\n";

	return 0;
}