Cod sursa(job #295901)

Utilizator ghiutaalexGhiuta Alex ghiutaalex Data 3 aprilie 2009 19:20:23
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include<stdio.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);
	 if(x%a==1) t=y+1;
	 else {
	       z=mod(x,y+1,9901)+9900;
	       if(z<0) z=-z;
	       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;
}