Cod sursa(job #530189)

Utilizator HoriaClementHoriaC HoriaClement Data 7 februarie 2011 09:49:35
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>

using namespace std;

const int M=9901;

int inv[M],a,b,s;

ifstream in("sumdiv.in");
ofstream out("sumdiv.out");

int fpow(int a,int n)
{
	if(n==0)
		return 1;
	if(n%2)
		return a*fpow(a*a%M,n/2)%M;
	return fpow(a*a%M,n/2);
}
int invers(int x)
{
	for(int i=1;i<M;++i)
	{
		if((i*x)%M==1)
		{
			inv[x]=i;
			inv[i]=x;
			return i;
		}
	}
	return 0;
}
void desc()
{
	int p=0,j;
	s=1;
	for(int i=2;i*i<=a;++i)
	{
		if(a%i!=0)
			continue;
		p=0;
		while(a%i==0)
		{
			a/=i;
			++p;
		}
		if(i%M==1)
			s*=p*b+1;
		else
		{
			if(i%M==0)
				j=M-1;
			else
				j=(i-1)%M;
			if(j==0)
			{
				s*=(p+1);
				s%=M;
				continue;
			}
			if(inv[j]!=0)
			{
				s*=(fpow(i,p*b+1)+M-1)%M*inv[j]%M;
				s%=M;
			}
			else
			{
				s*=(fpow(i,p*b+1)+M-1)%M*invers(j)%M;
				s%=M;
			}
		}
	}
	if(a!=1)
	{
		if(a%M==1)
		{
			s*=b+1;
			s%=M;
		}
		else
		{
			s*=(fpow(a,b+1)+M-1)%M*invers((a+M-1)%M)%M;
			s%=M;
		}
	}
}
	
void work()
{
	in>>a>>b;
	desc();
	out<<s;
}
int main()
{
	work();
	return 0;
}