Luzhiled's Library

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub ei1333/library

:heavy_check_mark: test/verify/yosupo-discrete-logarithm-mod.test.cpp

Depends on

Code

// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/discrete_logarithm_mod
// clang-format on

#include <iostream>

#include "../../math/combinatorics/mod-log.hpp"

using namespace std;

int main() {
  int T;
  cin >> T;
  while (T--) {
    long long X, Y, M;
    cin >> X >> Y >> M;
    cout << mod_log(X, Y, M) << endl;
  }
}
#line 1 "test/verify/yosupo-discrete-logarithm-mod.test.cpp"
// clang-format off
// competitive-verifier: PROBLEM https://judge.yosupo.jp/problem/discrete_logarithm_mod
// clang-format on

#include <iostream>

#line 2 "math/combinatorics/mod-log.hpp"

#include <cstdint>
#include <numeric>
#include <unordered_map>

/**
 * @brief Mod Log(離散対数問題)
 *
 */
std::int64_t mod_log(std::int64_t a, std::int64_t b, std::int64_t p) {
  std::int64_t g = 1;

  for (std::int64_t i = p; i; i /= 2) (g *= a) %= p;
  g = std::gcd(g, p);

  std::int64_t t = 1, c = 0;
  for (; t % g; c++) {
    if (t == b) return c;
    (t *= a) %= p;
  }
  if (b % g) return -1;

  t /= g;
  b /= g;

  std::int64_t n = p / g, h = 0, gs = 1;

  for (; h * h < n; h++) (gs *= a) %= n;

  std::unordered_map<std::int64_t, std::int64_t> bs;
  for (std::int64_t s = 0, e = b; s < h; bs[e] = ++s) {
    (e *= a) %= n;
  }

  for (std::int64_t s = 0, e = t; s < n;) {
    (e *= gs) %= n;
    s += h;
    if (bs.count(e)) return c + s - bs[e];
  }
  return -1;
}
#line 8 "test/verify/yosupo-discrete-logarithm-mod.test.cpp"

using namespace std;

int main() {
  int T;
  cin >> T;
  while (T--) {
    long long X, Y, M;
    cin >> X >> Y >> M;
    cout << mod_log(X, Y, M) << endl;
  }
}

Test cases

Env Name Status Elapsed Memory
g++ even_mod_00 :heavy_check_mark: AC 145 ms 5 MB
g++ even_mod_01 :heavy_check_mark: AC 181 ms 5 MB
g++ even_mod_impossible_00 :heavy_check_mark: AC 2 ms 4 MB
g++ even_mod_impossible_01 :heavy_check_mark: AC 2 ms 4 MB
g++ example_00 :heavy_check_mark: AC 2 ms 4 MB
g++ max_random_00 :heavy_check_mark: AC 232 ms 5 MB
g++ max_random_01 :heavy_check_mark: AC 211 ms 5 MB
g++ max_random_02 :heavy_check_mark: AC 192 ms 5 MB
g++ max_random_yes_00 :heavy_check_mark: AC 216 ms 5 MB
g++ max_random_yes_01 :heavy_check_mark: AC 217 ms 5 MB
g++ max_random_yes_prime_00 :heavy_check_mark: AC 302 ms 5 MB
g++ max_random_yes_prime_01 :heavy_check_mark: AC 301 ms 5 MB
g++ random_00 :heavy_check_mark: AC 65 ms 5 MB
g++ random_01 :heavy_check_mark: AC 107 ms 5 MB
g++ random_02 :heavy_check_mark: AC 142 ms 5 MB
g++ random_prime_00 :heavy_check_mark: AC 324 ms 5 MB
g++ random_prime_01 :heavy_check_mark: AC 317 ms 5 MB
g++ small_00 :heavy_check_mark: AC 2 ms 4 MB
g++ small_01 :heavy_check_mark: AC 2 ms 3 MB
g++ small_02 :heavy_check_mark: AC 2 ms 4 MB
clang++ even_mod_00 :heavy_check_mark: AC 146 ms 5 MB
clang++ even_mod_01 :heavy_check_mark: AC 181 ms 5 MB
clang++ even_mod_impossible_00 :heavy_check_mark: AC 2 ms 4 MB
clang++ even_mod_impossible_01 :heavy_check_mark: AC 2 ms 4 MB
clang++ example_00 :heavy_check_mark: AC 2 ms 4 MB
clang++ max_random_00 :heavy_check_mark: AC 233 ms 5 MB
clang++ max_random_01 :heavy_check_mark: AC 213 ms 5 MB
clang++ max_random_02 :heavy_check_mark: AC 192 ms 5 MB
clang++ max_random_yes_00 :heavy_check_mark: AC 220 ms 5 MB
clang++ max_random_yes_01 :heavy_check_mark: AC 220 ms 5 MB
clang++ max_random_yes_prime_00 :heavy_check_mark: AC 305 ms 5 MB
clang++ max_random_yes_prime_01 :heavy_check_mark: AC 304 ms 5 MB
clang++ random_00 :heavy_check_mark: AC 65 ms 5 MB
clang++ random_01 :heavy_check_mark: AC 107 ms 5 MB
clang++ random_02 :heavy_check_mark: AC 143 ms 5 MB
clang++ random_prime_00 :heavy_check_mark: AC 323 ms 5 MB
clang++ random_prime_01 :heavy_check_mark: AC 322 ms 5 MB
clang++ small_00 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_01 :heavy_check_mark: AC 2 ms 4 MB
clang++ small_02 :heavy_check_mark: AC 2 ms 4 MB
Back to top page