Cod sursa(job #1246888)

Utilizator mgntMarius B mgnt Data 21 octombrie 2014 19:23:33
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <iostream>

long
dec
( long  m
, long  x
)
{ // Compute x-1 modulo m.
  x += (m-1);
  x %= m;
  return x;
}

long
exp
( long  m
, long  x
, long  k
)
{ // Compute x**k, modulo m.
  x %= m;
  long  e = 1;
  long  b = 1;
  while(0<k)
  { if(0 != (k & b) )
    { k ^= b;
      e *= x;
      e %= m;
    }
    x *= x;
    x %= m;
    b *= 2;
  }
  return e;
}

long
div
( long  p
, long  a
, long  b
)
{ // Compute a/b modulo p, where p is a prime number.
  long  x; 
  long  y; 
  x  = a % p;
  y  = exp(p, b, p-2);
  x *= y;
  x %= p;
  return x;
}

bool
solveSumdiv
()
{ ::std::ifstream  is("sumdiv.in");
  long  const m = 9901; // a prime number
  long  A;
  long  B;
  is >> A >> B;
  
  // f(x) = ∑ d ∣ x 😼 d.
  // f is multiplicative.
  long  f = 1;
  long  p;
  for(p=2; 1<A; ++p)
  { if(0 == (A%p) )
    { long  k = 0;
      while(0 == (A%p) )
      { A /= p;
        ++k;
      }
      k *= B;
      ++k;
      
      long  a = dec(m, exp(m, p, k));
      long  b = dec(m, p);
      long  c = div(m, a, b);
      f *= c;
      f %= m;
    }
  }
  
  ::std::ofstream  os("sumdiv.out");
  os << f << ::std::endl;
  
  return true; // Success.
}

int
main
()
{ int  status;
  try
  { bool  const ok = solveSumdiv();
    status = ( ok ? 0 : 1 );
  }
  catch ( ... )
  { status = 2;
  }
  return status;
}