Cod sursa(job #194178)

Utilizator savimSerban Andrei Stan savim Data 8 iunie 2008 18:39:45
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#define maxl 1000
#define v 9901
#include <math.h>

long long i,j,k,n,a,b,cop,sol,t,p;
long long prim[maxl],put[maxl],calc[maxl];

long long rez(long long x, long long y)
{
	 if (y==1) return (x%v);
     
     p=rez(x,y/2);
	 if (y%2==0) t=((p%v)*(p%v))%v;
     else t=((((p%v)*(p%v))%v)*x)%v;

	 return t;
}
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);

	scanf("%lld %lld",&a,&b);

	n=0;
	if (a%2==0) prim[++n]=2;
    while (a%2==0) {a/=2;put[n]++;}

    while (a>1)
    {
        k=(int)sqrt(a);cop=a;
		for (i=3; i<=k; i+=2)
			if (a%i==0)
            {
                prim[++n]=i;
                while (a%i==0)
                {
                      put[n]++;
                      a/=i;      
                }
            }
        if (a==cop)
        {
           prim[++n]=a;
           put[n]=1;
           a=1;
        }
	}

    for (i=1; i<=n; i++) put[i]*=b;
    for (i=1; i<=n; i++)
    {
		calc[i]=rez(prim[i],put[i]+1);calc[i]--;
		if (calc[i]<0) calc[i]+=v;
		if (calc[i]==0) for(;;);

		for (j=0; j<=v; j++)
			if ((1LL*j*prim[i]-j)%v==1)
			{
			   calc[i]=(1LL*calc[i]*j)%v;
			   break;
			}
	}

	sol=1;
	for (i=1; i<=n; i++)
		sol=(1LL*sol*calc[i])%v;
	printf("%lld\n",sol);

	return 0;
}