Cod sursa(job #467694)

Utilizator ionutz32Ilie Ionut ionutz32 Data 29 iunie 2010 22:47:42
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#include <math.h>
#define MOD 9901

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

int power(int exp)
{
	int ret=1,a=i;
	while (exp)
	{
		if (exp & 1)
			ret=(ret*a)%MOD;
		a=(a*a)%MOD;
		exp/=2;
	}
	return ret;
}

int val(int 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 (val(exp/2)*(1+power(exp/2)))%MOD;
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%d %d",&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])
		{
			p=0;
			while (a%i==0)
			{
				a/=i;
				++p;
			}
			sol=sol*(1+val(b*p))%MOD;
		}
	printf("%d",sol);
	return 0;
}