Cod sursa(job #467705)

Utilizator ionutz32Ilie Ionut ionutz32 Data 29 iunie 2010 23:38:11
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <stdio.h>
#include <math.h>
#define MOD 9901

long long a,b,rad,v[7080],i,j,last,p,sol;

inline long long power(long long exp)
{
	long long ret=1,a=i;
	while (exp)
	{
		if (exp & 1)
			ret=(1LL*ret*a)%MOD;
		a=(1LL*a*a)%MOD;
		exp>>=1;
	}
	return ret;
}

long long val(long long exp) //returns ( i + i^2 + i^3 + ... + i^exp ) % MOD
{
	if (!exp)
		return 0;
	if (exp%2)
		return (val(exp-1)+power(exp))%MOD;
	return (1LL*val(exp/2)*(1+power(exp/2)))%MOD;
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%lld %lld",&a,&b);
	rad=int(sqrt(a));
	for (i=2;i<=rad;++i)
		if (!v[i])
		{
			for (j=i;j<=rad/i;++j)
				v[j*i]=1;
			v[last]=i;
			last=i;
		}
	sol=1;
	for (i=2;i;i=v[i])
		if (v[i]!=1 && a%i==0)
		{
			p=0;
			while (a%i==0)
			{
				a/=i;
				++p;
			}
			sol=sol*(1+val(b*p))%MOD;
		}
	if (a>1)
	{
		i=a;
		sol=(1LL*sol*(1+val(b)))%MOD;
	}
	printf("%lld",sol);
	return 0;
}