Cod sursa(job #2065626)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 13 noiembrie 2017 22:54:53
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>

typedef long long i64;
#define MOD 9901

inline i64 pow(i64 a, i64 b) {
  i64 p = 1;
  while (b > 0) {
    if (b & 1) {
      p = (p * a) % MOD;
    }
    a = (a * a) % MOD;
    b >>= 1;
  }
  return p;
}

int main() {
  i64 a, b, d, e, ans;
  FILE *f = fopen("sumdiv.in", "r");
  fscanf(f, "%lld%lld", &a, &b);
  fclose(f);
  d = 2;
  ans = 1;
  while (d * d <= a) {
    if (!(a % d)) {
      e = 0;
      while (!(a % d)) {
        ++e;
        a /= d;
      }
      ans = ((ans * ((pow(d, b * e + 1) - 1) % MOD)) + MOD) % MOD;
      ans = ((ans * (pow(d - 1, MOD - 2) % MOD)) + MOD) % MOD;
    }
    ++d;
  }
  if (a > 1) {
    if (a % MOD == 1) {
      ans = (ans * (b + 1)) % MOD;
    } else {
      ans = ((ans * ((pow(a, b + 1) - 1) % MOD)) + MOD) % MOD;
      ans = ((ans * (pow(a - 1, MOD - 2) % MOD)) + MOD) % MOD;
    }
  }
  f = fopen("sumdiv.out", "w");
  fprintf(f, "%lld\n", ans);
  fclose(f);
  return 0;
}