Cod sursa(job #1062251)

Utilizator federerUAIC-Padurariu-Cristian federer Data 20 decembrie 2013 22:10:55
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<fstream>
#define MOD 9901
using namespace std;

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

long A, B, sdiv=1, rez;
long f[100], expo[100], N, d, i;

void putere(long b, long e)
{
	while (e)
	{
		if (e % 2 == 0)
		{
			e /= 2;
			b = (b*b)%MOD;
		}
		else
		{
			rez = (rez*b)%MOD;
			e--;
		}
	}

}

void desc_fact(long x)
{
	long d = 2;
	if (x%d == 0)
	{
		N++;
		f[N] = d;
		while (x%d == 0)
		{
			++expo[N];
			x /= d;
		}
	}
	++d;
	while (d*d <= x)
		if (x%d != 0)
			d += 2;
		else
		{
			N++;
			f[N] = d;
			while (x%d == 0)
			{
				expo[N]++;
				x /= d;
			}
		d += 2;
	}
	if (x > 1)
	{
		N++;
		expo[N] = 1;
		f[N] = x;
	}
}

int main()
{
	fin >> A >> B;
	desc_fact(A);
	for (i = 1; i <= N; ++i)
		expo[i] *= B;
	for (i = 1; i <= N; ++i)
	{
		rez = 1;
		putere(f[i], expo[i]+1);
		sdiv = ((rez+MOD-1)%MOD*sdiv)%MOD;
		rez = 1;
		putere(f[i] - 1, MOD - 2);
		sdiv = (rez*sdiv)%MOD;
	}
	fout << sdiv%MOD << '\n';
	return 0;
}