Cod sursa(job #1944838)

Utilizator GoogalAbabei Daniel Googal Data 29 martie 2017 11:44:46
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,z = no;
  while(power){
    if(power % 2 == 1){
      r *= z;
      r %= MOD;
    }
    power/=2;
    z *= z;
    z %= 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;
}