Cod sursa(job #396698)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 15 februarie 2010 19:03:24
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <stdio.h>
#define NMAX 50
#define MOD 9901
int v[NMAX], f[NMAX];
int A, B;
void scade(int &x){
	x--;
	if(x == 0) x = MOD-1;
}
void cmmdc(int a, int b,int &d, int &x, int &y){
	if(b == 0){
		d = a;
		x = 1;
		y = 0;
		return;
	}
	int x0, y0;
	cmmdc(b, a%b, d, x0, y0);
	x = y0;
	y = x0 - (a / b)*y0;
}
int factor(int i){
	int sol = 1, x = v[i], n = f[i]+1;
	for(; n; n/=2){
		if(n & 1) sol = (sol*x)%MOD;
		x = (x * x) %MOD;
	}
	scade(sol);
	int y, d;
	cmmdc(MOD, v[i] - 1, d, x, y);
	while(y < 0) y += MOD;
	return (sol * y / d) % MOD;
}
int main(){
	freopen("sumadiv.in", "r", stdin);
	freopen("sumadiv.out", "w", stdout);
	scanf("%d%d", &A, &B);
	if(A == 1){
		printf("1\n");
		return 0;
	}
	for(int i = 2; i * i <= A; ++i){
		v[++v[0]] = i;
		for(; A %i == 0; A /= i, f[v[0]]++);
		f[v[0]] *= B;
	}
	if(A > 1){
		v[++v[0]] = A;
		f[v[0]] = B;
	}
	int p = 1;
	for(int i = 1; i <= v[0]; ++i)
		p = (p * factor(i))%MOD;
	printf("%d\n", p);
	return 0;
}