Cod sursa(job #794145)

Utilizator gabrielvGabriel Vanca gabrielv Data 5 octombrie 2012 19:00:20
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<cstdio>
#define MOD 9901

using namespace std;

long long A,B,S;

long long log_mult(long long base, long long pow)
{
    long long sol=1;
    while(pow)
    {
        if(pow&1)
            sol=(sol*base)%MOD;
        base=(base*base)%MOD;
        pow>>=1;
    }

    return sol;
}

void Read()
{
    freopen("sumadiv.in","r",stdin);
    scanf("%lld%lld",&A,&B);
}

long long termen( long long aux, long long p, long long exp)
{
    return ((((log_mult(aux/A,B)%MOD)*(p%MOD)-1)%MOD)/((p-1)%MOD))%MOD;
}

void TSFH()
{
  long long aux,i,exp;
   S=1;

  for(i=2;i*i<=A;i++)
  {
      if(A%i)
        continue;

      aux=A;
      exp=0;

      while(A%i==0)
          A/=i,exp++;

     S=(S*termen(aux,i,exp))%MOD;
  }

  if(A!=1)
    S=(S*(((log_mult(A,B+1)-1)%MOD)/((A-1)%MOD)))%MOD;

}

void Print()
{
    freopen("sumadiv.out","w",stdout);
    printf("%lld\n",S%MOD);
}

int main()
{
    Read();
    TSFH();
    Print();
    return 0;
}