Cod sursa(job #196217)

Utilizator slayer4uVictor Popescu slayer4u Data 24 iunie 2008 21:03:28
Problema Suma divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>

long long nr, j, a, b, rez, sum, SUM, i, puteri[100], exp[100];

inline long long mul(long long a, long b) 
{
	return ((a % 9901) * (b % 9901)) % 9901;
}

long long pow(long p, long n)
{
	if (n == 1) return p % 9901;
	if (n == 0) return 1;

	long tmp = pow(p, n / 2);
	return mul(mul(tmp, tmp), mul(p, (n % 2)));
}


long long numerge(long n, long p)
{
	if (n == 0) return 1;
	if (n == 1) return (p + 1) % 9901;

	long long tmp = numerge(n / 2, p);

	return (mul(tmp, (1 + pow(p, n / 2))) - mul(!(n % 2), pow(p, n + 1)) + 9901) % 9901;
}

int main()
{
	freopen ("sumdiv.in", "rt", stdin);
	freopen ("sumdiv.out", "wt", stdout);

	scanf("%lld %lld", &a, &b);

	if (a == 1 || !b)
	{
		printf("1\n");
		return 0;
	}
	
	for (i = 2; i * i <= a; ++i)
	{
		if (a % i == 0)
		{		
			puteri[++puteri[0]] = i;
			++exp[0];
			while (a % i == 0)
			{
				++exp[exp[0]];
				a /= i;
			}
			exp[exp[0]] *= b;
		}
	}
	if (a > 1)
	{
		puteri[++puteri[0]] = a;
		exp[++exp[0]] = b;
	}

	SUM = 1;
	for (i = 1; i <= puteri[0]; ++i)
	{
		sum = 1;
		nr = 1;
		for (j = 1; j <= exp[i]; ++j)
		{
			sum += (nr * puteri[i]) % 9901;
			nr *= puteri[i];
			nr %= 9901;
		}
		SUM *= (sum % 9901);
		SUM %= 9901;
	}

	SUM %= 9901;

	printf("%lld\n", SUM);

	return 0;
}