Cod sursa(job #470893)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 15 iulie 2010 21:36:58
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>

#define file_in "sumdiv.in"
#define file_out "sumdiv.out"

int A,B;

void citire()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &A, &B);
}

#define mod 9901

inline int prodMod(int x, int y)
{
  return (x*y)%mod;
}

inline int power(int a, int b)
{
	int x;
	if (!b)
		return 1;
	x=power(a,b>>1);
	x=prodMod(x,x);
	if (b&1)
		x=prodMod(x,a);
	return x;
}

inline int invMod(int a)
{
	if (!a)
       return 0;
    int rez=1;
  while (rez%a)
    rez+=mod;
  return rez/a;
}

inline int progresie(int n, int e)
{
	if (n==1)
		return (e+1)%mod;
	return prodMod((power(n,e+1)+mod-1)%mod,invMod((n+mod-1)%mod));
}

	

void solve()
{
	int S,p,d;
	S=0;
	for (p=0;!(A&1);++p,A>>=1); 
	S=progresie(2,p*B);
	for (d=3;d*d<=A;d+=2) 
	{
		if (!(A%d))
		{
			for (p=0;!(A%d);++p,A/=d);
			S=(S*progresie(d%mod,p*B))%mod;
		}
	}
	if (A>1)
		S=(S*progresie(A%mod,B))%mod;

	printf("%d\n", S);
}

int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}