Cod sursa(job #496229)

Utilizator Teodor94Teodor Plop Teodor94 Data 28 octombrie 2010 10:11:56
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<cstdio>

const int R=9901;
const int N=1000000;

int a,b,nr,pr[N],exp[N],s=1,inv[R+5];

void afis()
{
	for (int i=1;i<=nr;++i)
		printf("%d %d\n",pr[i],exp[i]);
}

void citire()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%d%d",&a,&b);
}

void desc(int x)
{
	int p;
	for (int i=2;i*i<=x;++i)
		if (x%i==0)
		{
			p=0;
			while (x%i==0)
				++p,x/=i;
			pr[++nr]=i;
			exp[nr]=p;
		}
	if (x!=1)
	{
		pr[++nr]=x;
		exp[nr]=1;
	}
}

int putere(int n,int p)
{
	int rez=1,x=n%R;
	while (p)
	{
		if (p&1)
		{
			rez*=x;
			rez%=R;
		}
		x*=x;
		x%=R;
		p>>=1;
	}
	return rez;
}

void inverse()
{
	inv[1]=1;
	for (int i=2;i<R;++i)
		if (inv[i]==0)
		{
			inv[i]=putere(i,R-2);
			inv[inv[i]]=i;
		}
}

void calcul()
{
	for (int i=1;i<=nr;++i)
		exp[i]*=b;
	for (int i=1;i<=nr;++i)
	{
		s*=(putere(pr[i],exp[i]+1)+R-1)%R;
		s%=R;
		s*=inv[(pr[i]+R-1)%R];
		s%=R;
	}
	printf("%d\n",s);
}

int main()
{
	citire();
	desc(a);
	inverse();
	//afis();
	calcul();
	return 0;
}