Cod sursa(job #1065711)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 23 decembrie 2013 16:39:53
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include<cstdio>
#include<vector>
#define NMAX 500000
#define MOD 9901
using namespace std ;

int A, B, N, sum = 1 ;
vector<int> prime(NMAX) ;
vector<long long> nrp(NMAX) ;

void fact(int A) ;
void solve() ;
void write() ;
int risep(int x, long long p) ;

int main() {
	int i ;
	freopen("sumdiv.in", "r", stdin) ;
	freopen("sumdiv.out", "w", stdout) ;
	scanf("%d %d", &A, &B) ;
	fact(A) ;
	for (i = 1; i <= N; ++i) {
		nrp[i] *= B ;
	}
	solve() ;
	write() ;
	return 0 ;
}

void fact(int A) {
	int p ;
	N = 0 ;
	if (A % 2 == 0) {
		++N ;
		prime[N] = 2 ;
		while(A % 2 == 0) {
			A >>= 1 ;
			++nrp[N] ; 
		}
	}
	for (p = 3; p * p <= A; p += 2) {
		if (A % p == 0) {
			++N ;
			prime[N] = p ;
			while(A % p == 0) {
				A /= p ;
				++nrp[N] ; 
			}
		}
	}
	if (A > 1) {
		++N;
		prime[N] = A ;
		nrp[N] = 1;
	}
}


void solve() {
	int i, A, B ;
	for (i = 1; i <= N; ++i) {
		A = risep(prime[i],nrp[i] + 1) ;
		A = A + MOD - 1 ;
		A %= MOD ;
		B = risep(prime[i] - 1, MOD - 2) ;
		sum *= (A * B) % MOD ;
		sum %= MOD ;
	}
}

void write() {
	printf("%d\n", sum) ;
}

int risep(int x, long long p) {
	if (p == 1) return x % MOD ;
	int result ;
	result = risep(x, p / 2) ;
	result *= result ;
	result %= MOD ;
	if ((p & 1) == 1) result *= x % MOD ;
	return result % MOD ;
}