Cod sursa(job #494469)

Utilizator Adela_BaciuAdela Baciu Adela_Baciu Data 21 octombrie 2010 18:47:02
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>

const int r = 9901;
const int N = 1<<13;

int p[N],invers[r],np;
bool c[N];

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

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

void calcul_invers()
{
	int i;
	for(i=1 ; i<r ; ++i)
	{
		if(invers[i]!=0)
			continue;
		invers[i] = putere(i,r-2);
	}
}

int suma(int a,int b)
{
	int i,exp,s = 1,pow;
	for(i=1 ; p[i]*p[i] <= a ; ++i)
	{
		if(a%p[i] != 0)
			continue;
		for(exp=0 ; a%p[i] == 0 ; a/=p[i])
			++exp;
		pow = putere(p[i],exp*b+1);
		if(p[i]%r == 1)
			s = (long long)s*(exp+1)%r;
		else
			s = (long long)s*((pow+r-1)%r)*invers[(p[i]+r-1)%r]%r;
	}
	if(a != 1)
		if(a%r == 1)
			s = (long long)s*(b%r+1)%r;
		else
		{
			pow = putere(a,b+1);
			s = (long long)s*((pow+r-1)%r)*invers[(a+r-1)%r]%r;
		}
	return s%r;
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	int a,b;
	scanf("%d%d",&a,&b);
	ciur();
	calcul_invers();
	printf("%d\n",suma(a,b));
	return 0;
}