Cod sursa(job #295878)

Utilizator ghiutaalexGhiuta Alex ghiutaalex Data 3 aprilie 2009 19:04:20
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<math.h>
FILE*f=fopen("sumdiv.in","r");
FILE*g=fopen("sumdiv.out","w");

long long a,b;
int ba[101],ex[101],n,pr=1;

long long mod(long long x,long long y,long long z)
{
 long long s;
 if(y==1) return x%z;
 else if(y%2==0) {
		  s=mod(x,y/2,z);
		  return (s*s)%z;
		 }
      else return (mod(x,y-1,z)*mod(x,1,z))%z;
}

void fact()
{
 long long i,r;
 for(i=2;i*i<=a;i++)
	{
	 if(a%i==0) {
                     r=0;
                     while(a%i==0) {
                                    r++;
                                    a/=i;
                                   }
                     if(r) {
                            ba[++n]=i;
                            ex[n]=r;
                           }
                     }
	}
 if(a>1) {
	  ba[++n]=a;
	  ex[n]=1;
	 }
}

void sum()
{
 int i,j;
 long long x,y,t,z,z1;
 for(i=1;i<=n;i++)
	{
	 x=ba[i];y=(ex[i]*b);
	 z=abs(mod(x,y+1,9901)-1);
	 z1=mod(x-1,9899,9901);
	 t=(z*z1)%9901;
	 pr=(pr*t)%9901;
        }
 fprintf(g,"%d",pr);
}

int main()
{
 fscanf(f,"%lld%lld",&a,&b);
 fact();
 sum();
 fcloseall();
 return 0;
}