Cod sursa(job #194119)

Utilizator raduzerRadu Zernoveanu raduzer Data 8 iunie 2008 14:38:22
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <stdio.h>

long long n,x,y,i,j,a[10],b[10];
long long s,s2,z;

long long log(long long x, long long y)
{
	long long t=1;   
	for (int k=y; k>0; k/=2)   
	{   
		if (k%2==1) t=(t*x)%9901;   
		x=(x*x)%9901;   
	}   
	return t;
}

int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);
	scanf("%lld%lld",&x,&y);
	if (x==1 || y==0) printf("1\n");
	if (y==1) printf("%d",x%9901);
	for (i=2; i*i<=x; ++i)
	{
		if (x%i) continue;
		a[++n]=i;
		while (x%i==0) { x/=i; ++b[n]; }
	}
	if (x>1) { a[++n]=x; b[n]=1; }
	s=1;
	for (i=1; i<=n; ++i)
	{
		b[i]*=y; 
		z=(log(a[i],b[i])*a[i]-1)%9901;
		if (z<0) z=1;
		z=(z*log(a[i]-1,9901-2))%9901;
		if (z==0) z=1;
		s=(s*z)%9901;
	}
	printf("%lld\n",s);
	return 0;
}