Cod sursa(job #1944170)

Utilizator GoogalAbabei Daniel Googal Data 28 martie 2017 23:09:14
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>

using namespace std;

ifstream in("sumdiv.in");
ofstream out("sumdiv.out");

int const MOD = 9901;
int a,b;
long long rez = 1;

int putere(int no, int power){
  int r = 1;
  for(int i = 0; (1<<i) <= power; i++){
    if(((1<<i) & power) > 0)
      r = (r * no) % MOD;
    no = (no * no) % MOD;
  }
  return r;
}

void inv_mod(long long &x, long long &y, int a, int b){

  if(!b){
    x=1;
    y=0;
  }

  else{
    inv_mod(x, y, b, a%b);
    swap(x,y);
    y -= x * (a/b);
  }
}

int turn_to_inv(int x){
  long long inv = 0, ins;
  inv_mod(inv, ins, x, MOD);
  if(inv <= 0){
    inv = MOD + inv % MOD;
  }
  return inv;
}

int main()
{
  in >> a >> b;
  in.close();
  for(int i=2; i*i <= a; i++){
    if(!(a%i)){
      int p=0;
      while(!(a%i)){
        p++;
        a/=i;
      }
      rez = (((rez * putere(i, b*p + 1) - 1) % MOD) *
             (turn_to_inv(i-1))) % MOD;
    }
  }

  if(a>1){
    rez = (((rez * putere(a, b+1) -1) % MOD) *
            (turn_to_inv(a-1))) % MOD;
  }

  out << rez;
  out.close();
  return 0;
}