algo

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub dnx04/algo

:heavy_check_mark: math/ModLog.h

Verified with

Code

i64 modLog(i64 a, i64 b, i64 m) {
  i64 n = (i64) sqrt(m) + 1, e = 1, f = 1, j = 1;
  unordered_map<i64, i64> A;
  while (j <= n && (e = f = e * a % m) != b % m) A[e * b % m] = j++;
  if (e == b % m) return j;
  if (gcd(m, e) == gcd(m, b)) {
    for (int i = 2; i < n + 2; ++i) {
      if (A.count(e = e * f % m)) return n * i - A[e];
    }
  }
  return -1;
}
#line 1 "math/ModLog.h"
i64 modLog(i64 a, i64 b, i64 m) {
  i64 n = (i64) sqrt(m) + 1, e = 1, f = 1, j = 1;
  unordered_map<i64, i64> A;
  while (j <= n && (e = f = e * a % m) != b % m) A[e * b % m] = j++;
  if (e == b % m) return j;
  if (gcd(m, e) == gcd(m, b)) {
    for (int i = 2; i < n + 2; ++i) {
      if (A.count(e = e * f % m)) return n * i - A[e];
    }
  }
  return -1;
}
Back to top page