Cod sursa(job #184651)

Utilizator VmanDuta Vlad Vman Data 24 aprilie 2008 00:20:45
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>

#define Pmax 100
//#define modulo 9901

int A,B,i,total,modulo;
int P[Pmax],pow[Pmax],nr;

long long power(long long baza,long long pow)
{
 long long aux;

 if (pow==1) return baza % modulo;
 if (pow & 1) return (power(baza, pow-1) * baza) % modulo;
    else
        {
         aux=power(baza, pow >> 1);
         return (aux*aux) % modulo;
        }
}

void solve()
{
 int aux,inv;

 for (i=1; i<=nr; ++i)
     {
      modulo=9901;
      inv=power((P[i]-1) % modulo, modulo-2);
      if (inv==0) { modulo=(P[i]-1)*9901; inv=1; }
      
      aux=power(P[i] % modulo, pow[i]*B+1)-1;
      
      if (aux < 0) aux+=modulo;
      if (modulo>9901) { aux/=(P[i]-1);modulo=9901; }

      total=(((total * aux) % modulo) * inv) % modulo;
     }
}

void factori()
{
 for (i = 2; i*i <= A; ++i)
     if (A % i == 0)
        {
         P[++nr]=i;
         while (A % i == 0) 
               {
                A /= i;
                ++pow[nr];
               }
        }
 if (A > 1) 
    {
     P[++nr] = A;
     pow[nr]=1;
    }
}

int main()
{
 freopen("sumdiv.in","r",stdin);
 freopen("sumdiv.out","w",stdout);
 scanf("%d %d",&A,&B);
 total=1;
 factori();
 solve();
 printf("%d",total);
 fclose(stdout);
 return 0;
}