Cod sursa(job #478130)

Utilizator CezarMocanCezar Mocan CezarMocan Data 17 august 2010 15:39:04
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>

const int mod = 9901;

using namespace std;

int A, B, rez, nr;

inline int putere(int N, int exp) {
	if (exp == 0)	return 1;
	if (exp == 1)	return N % mod;

	if (exp % 2 == 0) {
		int aux = putere(N % mod, exp / 2);
		return (aux * aux % mod);
	}
	else {
		return (putere(N % mod, exp - 1) * N % mod);
	}	
}

int main() {
	int i;

	freopen("sumdiv.in", "r", stdin);
	freopen("sumdiv.out", "w", stdout);

	scanf("%d%d", &A, &B);
	if (A == 1) {
		printf("1\n");
		return 0;
	}

	rez = 1;
	for (i = 2; i * i <= A; i++) if (A % i == 0) {

		nr++;
		int exp = 0;

		while (A % i == 0) {
			A /= i;
			exp++;
		}

		exp *= B;

		if (i % mod == 1)
			rez = rez * (exp + 1) % mod;
		else
			rez = rez * (putere(i, exp + 1) + mod - 1) % mod * putere(i - 1, mod - 2) % mod;
	}

//	printf("%d\n", A);
	if (A != 1)
		if (A % mod != 0)
			rez = (rez * ((putere(A, B + 1) + mod - 1) % mod)) % mod * putere(A % mod - 1, mod - 2) % mod;
		else
			rez = rez * (B % mod + 1) % mod;

	printf("%d\n", rez);


	return 0;
}