Cod sursa(job #496185)

Utilizator Teodor94Teodor Plop Teodor94 Data 28 octombrie 2010 08:31:38
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<cstdio>

const int R=9901;
const int N=50000001;
const int M=8000000;

int a,b,pr[M],nr;
bool c[N];

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

void ciur()
{
	for (int i=2;i*i<N;++i)
		if (!c[i])
			for (int j=i*i;j<N;j+=i)
				c[i]=true;
	for (int i=2;i<N;++i)
		if (!c[i])
			pr[++nr]=i;
}

inline long long putere(long long a,int n)
{
	long long p=1;
	while (n!=0)
	{
		if (n&1!=0)
			p*=a;
		a*=a;
		n>>=1;
	}
	return p;
}

void calcul()
{
	int pow;
	long long s=1,p;
	for (int i=1;(long long)pr[i]*pr[i]<=a;++i)
	{
		if (a%pr[i]!=0)
			continue;
		for (pow=0;a%pr[i]==0;a/=pr[i])
			++pow;
		p=putere(pr[i],(pow+1)*b);
		s*=(long long)(p-1)/(pr[i]-1);
		s%=R;
	}
	if (a!=1)
		s*=a+1;
	s%=R;
	printf("%d\n",(int)s);
}

int main()
{
	citire();
	ciur();
	calcul();
	return 0;
}