Cod sursa(job #393728)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 9 februarie 2010 21:05:48
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#define NMAX 10005
#define MOD 9901
#define ll long long
int a,b,r,rez=1;
struct div
{
	int a,b;
};
div A[NMAX];
void divs()
{
	int i;
	for (i=2; i*i<=a; i++)
		if (a%i==0)
		{
			A[++r].a=i;
			while (a%i==0)
			{
				a/=i;
				A[r].b++;
			}
			A[r].b*=b;
		}
	if (a!=1)
		A[++r].a=a,A[r].b=b;
}
int lgput(int baza,int exp)
{
	ll part=1,part2=baza;
	while (exp)
	{
		if (exp & 1)
			part*=part2,part%=MOD;
		part2*=part2;
		part2%=MOD;
		exp>>=1;
	}
	return part;
}
int factor(int baza,int exp)
{
	if (baza%MOD==1)
		return exp+1;
	baza%=MOD;
	int act=lgput(baza,exp+1),act2=lgput(baza-1,MOD-2);
	act--; 
	if (act<0)
		act+=MOD;
	return (act*act2)%MOD;
}
void solve()
{
	int i;
	for (i=1; i<=r; i++)
		rez*=factor(A[i].a,A[i].b),rez%=MOD;
}
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%d%d",&a,&b);
	divs();
	solve();
	printf("%d\n",rez);
	return 0;
}