Cod sursa(job #1064300)

Utilizator oopsSoare George oops Data 21 decembrie 2013 18:48:52
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
//#include"stdafx.h"
#include <stdio.h>

#define ll long long
const ll MOD = 9901;

void gcd(ll a, ll b, ll &x, ll &y)
{
	if (b == 0) {
		x = 1;
		y = 0; 
		return;
	}
	ll x0, y0;
	gcd(b, a % b, x0, y0);
	x = y0;
	ll mult = (y0* ((a / b) % MOD)) % MOD;
	y = ((MOD + x0 - mult) % MOD);

}

ll invers(ll x)
{
	ll a, b;	
	gcd(x, MOD, a, b);
	a = (MOD + a % MOD) % MOD;
	return a;
}

int modExp(int b, int e)
{
	int exp;
	int x = 1;

	while (e != 0)
	{
		exp = e % 2;
		e = e / 2;

		if (exp == 1)
			x = (x * b) % MOD;
		b = (b * b) % MOD; 
	}
	return x;
}

int main()
{
	ll i, a, b, s=1;
	freopen("sumdiv.in", "r", stdin);
	freopen("sumdiv.out", "w",stdout);
	scanf("%lld %lld", &a, &b);
	ll nr = a;
	for (i = 2; i*i <= nr; ++i)
	{
		int e;
		e = 0;
		while (a % i == 0)
		{
			++e;
			a = a / i;
		}
		if (e == 0)
			continue;
		int inv = invers(i - 1) % MOD, exp = (modExp(i, b*e + 1) - 1 + MOD)% MOD;
		s = (s * ((exp*inv) % MOD)) % MOD;
			
	}
	if (a > 1)
	{
		int inv = invers(a - 1);
		s = (s * (((modExp(a, b+1) - 1 + MOD)% MOD)*inv) % MOD) % MOD;
	}
	
	printf("%lld\n", s);
		
	return 0;
}