Cod sursa(job #185857)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 26 aprilie 2008 11:44:01
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
/*
 * avem de calculat suma div lu A^B, care de fapt este un nr X
 * X se poate factoriza in (p1^e1)*(p2^e2)*(p3^e3)...
 * se cere suma( (p1^a1)*(p2^a2)*(p3^a3)... ), cu 0<=ai<=ei
 * se poate demonstra prin ind, matematica :
 * sum = (1+p1+p1^2+...+p1^e1)*(1+p2+p2^2+..+p2^e2)*...
 *
 * vom avea la un moment dat rapoarte de genul (p1^(e1+1)-1)/(p1-1)
 * modular e ceva de genu x/y = z => z*y = x => z = invers_modular(y)*x
 */

#include <cstdio>
#define iofile \
	freopen("sumdiv.in", "r", stdin);\
	freopen("sumdiv.out", "w", stdout);
#define MAX_N 10000
#define MOD 9901

int p[MAX_N*4], e[MAX_N*4];
int A,B, n,x,y,z,i,r;

int putere(int a, int b) {
	int i, p=a, r=1;
	for ( i=0; (1<<i)<=b; ++i, p=(p*p)%MOD )
		if ( b & (1<<i) )
			r = (r*p)%MOD;
	return r;
}

int invers(int a) {
	return putere(a, MOD-2);
}

int main() {
	iofile;
	scanf("%d %d", &A, &B);

	if ( A==1 ) {
		printf("1\n");
		return 0;
	}

	// factorize
	x = A; n=0;
	for ( i=2; i*i<=A && x>1; ++i ) {
		for ( p[n]=i, e[n]=0; x%i==0; x /= i, e[n]++);
        e[n] *= B;
		++n;
	}
	if ( x>1 ) 
	    p[n] = x, e[n++] = B;
	// calcul
	for ( r=1, i=0; i<n; ++i ) {
		x = putere(p[i], e[i]+1)-1;
		x += x<0 ? MOD : 0;
		y = (p[i]-1) % MOD;
		z = (invers(y) * x) % MOD;
		r = (r*z) % MOD;
	}
		
	printf("%d\n", r);
	return 0;
}