Cod sursa(job #1066250)

Utilizator federerUAIC-Padurariu-Cristian federer Data 24 decembrie 2013 13:00:38
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<fstream>
#define MOD 9901
using namespace std;

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

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

int putere(long long x, long long y) {
	long long rez = 1;
	while (y > 0)
	if (y % 2 == 0) { x = (x*x)%MOD; y /= 2; }
	else { rez = (rez*x)%MOD; --y; }
	return rez;
}
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 invers(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)
	{
		if (f[i] % MOD == 1)
			sdiv = (sdiv*(expo[i] + 1))%MOD;
		else sdiv = (sdiv* ((putere(f[i], expo[i] + 1) + MOD - 1)%MOD * invers(f[i] - 1))%MOD)%MOD;
	}
	fout << sdiv%MOD << '\n';
	return 0;
}