Cod sursa(job #757036)

Utilizator radu_voroneanuVoroneanu Radu Stefan radu_voroneanu Data 10 iunie 2012 21:53:13
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>

#define MOD 9901

int A[1000], Nr[1000];
int i, act,a , b;
int Ans;

inline int put(int N, int K)
{
	int rez = 1;
	for (int i = 0; (1<<i) <= K; ++i){
		if (K & (1<<i))
			rez = (rez * N) % MOD;
		N = (N * N) % MOD;
	}
	return rez;
}

inline int f(int a, int b)
{
	if (b == 1) return a;
	if (b == 0) return 0;
	if (b & 1)
		return (a * (1+ f(a, b-1))) % MOD;
	else
		return ( f(a, b >> 1) * (1 + put(a, b >> 1)) )% MOD;
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	
	scanf("%d %d",&a, &b);
	for (i = 2; i * i <= a; ++i){
		if (a % i != 0) continue;
		A[++A[0]] = i;
		while (a % i == 0){
			a /= i;
			++Nr[A[0]];
		}
	}
	
	if (a != 1){
		A[++A[0]] = a;
		Nr[A[0]] = 1;
	}
	
	for (i = 1; i <= A[0]; ++i){
		Nr[i] *= b;
		A[i] %= MOD;
	}
	
	Ans = 1;
	for (i = 1; i <= A[0]; ++i)
		Ans = (Ans * ( f(A[i], Nr[i]) + 1)) % MOD;
	
	printf("%d\n", Ans);
	
	return 0;
}