Cod sursa(job #1066233)

Utilizator federerUAIC-Padurariu-Cristian federer Data 24 decembrie 2013 12:36:41
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#define MOD 9901
using namespace std;

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

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

void putere(long long x, long long y) {
	while (y > 0)
	if (y % 2 == 0) { x = (x*x)%MOD; y /= 2; }
	else { rez = (rez*x)%MOD; --y; }
}
void desc_fact(long long x)
{
	long 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;
	}
}
void euclid(long long &a, long long &b, long long x, long long y) {
	long long ao, bo;
	if (y == 0) { a = 1; b = 0; }
	else {
		euclid(ao, bo, y, x%y);
		a = bo;
		b = (ao - ((x / y)*bo)%MOD + MOD)%MOD;
	}
}

int inv(long long x) {
	long long a, b;
	euclid(a, b, x, MOD);
	return(a);
}
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;
		sdiv = (inv(f[i]-1)%MOD*sdiv)%MOD;
	}
	fout << sdiv%MOD << '\n';
	return 0;
}