Cod sursa(job #756900)

Utilizator VmanDuta Vlad Vman Data 10 iunie 2012 17:43:49
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Remember Mihai Pătrașcu Marime 1.24 kb
#include <cstdio>

#define Pmax 100
//#define modulo 9901

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

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()
{
 long long aux,inv;

 for (i=1; i<=nr; ++i)
     {
      modulo=9901;
      inv=power((P[i]-1) % modulo, modulo-2);
      if (inv==0) { modulo=(long long)(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=((((long long)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;
}