Cod sursa(job #396733)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 15 februarie 2010 19:48:17
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#define NMAX 50
#define MOD 9901
int v[NMAX], f[NMAX];
int A, B;
void scade(int &x){
	if(x == 0) x = MOD-1;
	else x--;
}
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]%MOD, n = f[i]+1;
	if(x == 1) return (n % MOD);
	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("sumdiv.in", "r", stdin);
	freopen("sumdiv.out", "w", stdout);
	scanf("%d%d", &A, &B);
	if(A == 1){
		printf("1\n");
		return 0;
	}
	for(int i = 2; i * i <= A; ++i)
		if(A%i == 0){
			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;
}