Cod sursa(job #194169)

Utilizator savimSerban Andrei Stan savim Data 8 iunie 2008 17:48:29
Problema Suma divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#define maxl 1000
#include <math.h>

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

long long rez(long long x, long long y)
{
	 if (y==0) return 1;

	 long long sol=0;
	 if (y%2==0) sol=1LL*rez(x,y/2)*rez(x,y/2);
	 else sol=1LL*rez(x,y/2)*rez(x,y/2)*x;

	 sol%=9901;
	 return sol;
}
int main()
{
	freopen("sumdiv.in","r",stdin);
	freopen("sumdiv.out","w",stdout);

	scanf("%d %d",&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 (k%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]+=9901;
        
        for (j=1; j<=9901; j++)
			if ((j*prim[i]-j)%9901==1)
			{
               calc[i]=(calc[i]*j)%9901;
               break;
            }
    }

    sol=1;
    for (i=1; i<=n; i++)
        sol=(sol*calc[i])%9901;
	printf("%lld\n",sol);
    
    return 0;    
}