Cod sursa(job #1062058)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 20 decembrie 2013 17:43:07
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
#define modulo 9901

ll b[200],e[200];
int counter;

void primeFactors(ll n){

	if(n % 2 == 0){
		b[counter] = 2;
		n >>= 1;
		++e[counter];
		while(n % 2 == 0)
			++e[counter],n >>= 1;
		counter++;
	}
	ll p = 3;
	int exp = 0;
	while(p * p <= n){
		if(n % p == 0){
			b[counter] = p;
			while(n % p == 0)
				n /= p,++e[counter];
			counter++;	
		}
		p += 2;
	}
	if (n > 1) 
	 b[counter] = n,e[counter++] = 1;
		
}
ll pow(ll a,ll b){
	ll res = 1;
	while (b)
	{
		if (b % 2)  
			res = (res * a) % modulo; 
		a = (a * a) % modulo;
		b >>= 1;
	}

	return res;
}
ll findInverse(ll a)
{
	ll x[3];
	ll y[3];
	ll b = modulo;
	ll quotient  = a / b;
	ll remainder = a % b;

	x[0] = 0;
	y[0] = 1;
	x[1] = 1;
	y[1] = quotient * -1;

	ll i = 2;
	for (; (b % (a % b)) != 0; i++)
	{
		a = b;
		b = remainder;
		quotient = a / b;
		remainder = a % b;
		x[i % 3] = (modulo + (quotient * -1 * x[(i - 1) % 3]) + x[(i - 2) % 3]) % modulo;
		y[i % 3] = (modulo + (quotient * -1 * y[(i - 1) % 3]) + y[(i - 2) % 3]) % modulo;
	}
	return x[(i - 1) % 3];
}

ll calc(ll A,ll B){
	ll sum = 1;
	int i;
	primeFactors(A);
	for(i = 0; i < counter; i++)
		sum *= ((pow(b[i],(e[i] * B + 1)) + modulo - 1) % modulo) * ((findInverse(b[i] - 1) % modulo)),sum %= modulo;
	return sum;
}

int main(){
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	ll A,B;
	scanf("%lld %lld", &A, &B);
	
	printf("%lld",calc(A,B));
	return 0;
}