Cod sursa(job #802088)

Utilizator robertpoeRobert Poenaru robertpoe Data 25 octombrie 2012 20:18:58
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<fstream>
#include<cstdio>
#define MODULO 9901
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
int A[1000],m[1000];
int i,act,a,b;
int rez;
inline int funct(int N,int K)
{
	int rez=1;
	for(int i=0;(1<<i)<=K;++i)
	{
		if (K&(1<<i))
			rez=(rez*N)%MODULO;
		N=(N*N)%MODULO;
	}
	return rez;
}
int recurent(int a, int b)
{
	if (b==1)
	return a;
	if (b==0)
	return 0;
	if (b & 1)
		return (a*(1+recurent(a,b-1)))%MODULO;
	else
		return (recurent(a,b>>1)*(1+funct(a,b>>1)))%MODULO;
}
int main()
{
	f>>a>>b;
	for(i=2;i*i<=a;++i)
	{
		if (a % i != 0)
		 continue;
		A[++A[0]] = i;
		while (a % i == 0)
		{
			a /= i;
			++m[A[0]];
		}
	}
	if(a!=1)
	{
		A[++A[0]] = a;
		m[A[0]] = 1;
	}
	for (i=1;i<=A[0];++i)
	{
		m[i]*=b;
		A[i]%=MODULO;
	}
	rez=1;
	for(i=1;i<=A[0];++i)
		rez=(rez*(recurent(A[i],m[i])+1))%MODULO;
	g<<rez;
	return 0;
}