Cod sursa(job #168991)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 31 martie 2008 22:27:00
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <cstdio>

const int MOD = 9901;

int A, B, R, N, D[1024], P[16], C[16];

int power(int u, int p) {
	int v;

	for (u %= MOD, v = 1; p; p >>= 1, u = (u * u) % MOD)
		if (p & 1)
			v = (v * u) % MOD;
	
	return v;
}

int main(void) {
	freopen("sumdiv.in", "rt", stdin);
	freopen("sumdiv.out", "wt", stdout);
	int i, j, stop, s;

	scanf(" %d %d", &A, &B);

	if (A % 2 == 0) {
		P[N] = 2;
		while (A % 2 == 0) ++C[N], A /= 2;
		++N;
	}

	for (i = 3; i * i <= A; i += 2)
		if (A % i == 0) {
			P[N] = i;
			while (A % i == 0) ++C[N], A /= i;
			++N;
		}
	
	if (A) {
		P[N] = A;
		C[N] = 1;
		++N;
	}

	D[0] = MOD - 1;
	for (i = 0; i < N; ++i) {
		s = (power(P[i], C[i] * B + 1) - 1) * power(P[i]-1, MOD-2);

		stop = 1 << i;
		for (j = 0; j < stop; ++j) {
			R += D[j | (1 << i)] = MOD - (s * D[j]) % MOD;
			if (R > MOD) R -= MOD;
		}
	}

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

	return 0;
}