Cod sursa(job #2080869)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 3 decembrie 2017 16:32:44
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>

using namespace std;

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

const int MOD = 9901;

long long Raise(int a, int b) {
  
  long long ans = 1;
  while (b) {

    if (b & 1) {
      ans = (ans * a) % MOD;
    }
    
    a = (a * a) % MOD;
    b >>= 1;
  }

  return ans;
}

void Solve(int a, int b) {

  long long s = 1;
  for (int i = 2; i * i <= a; i ++) {

    if (a % i) {
      continue;
    }

    int cur_exp = 0;
    while (a % i == 0) {
      
      a /= i;
      cur_exp ++;
    }

    cur_exp *= b;
    if (i % MOD == 0) {
      continue;
    }
    
    if (i % MOD == 1) {
      s = (s * (cur_exp + 1)) % MOD;
    }
    else {
      s = (s * (Raise(i, cur_exp + 1) - 1) * (Raise(i - 1, MOD - 2)));
    }
  }

  if (a != 1) {

    if (a % MOD == 1) {
      s = (s * (b + 1)) % MOD;
    }
    else if (a % MOD) {
      s = (s * (Raise(a, b + 1) - 1) * Raise(a - 1, MOD - 2)) % MOD;
    }
  }

  cout << s << '\n';
}
    
int main() {

  int a, b;
  cin >> a >> b;
  Solve(a, b);
}