This documentation is automatically generated by competitive-verifier/competitive-verifier
// 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;
}
}
| Env | Name | Status | Elapsed | Memory |
|---|---|---|---|---|
| g++ | even_mod_00 |
|
145 ms | 5 MB |
| g++ | even_mod_01 |
|
181 ms | 5 MB |
| g++ | even_mod_impossible_00 |
|
2 ms | 4 MB |
| g++ | even_mod_impossible_01 |
|
2 ms | 4 MB |
| g++ | example_00 |
|
2 ms | 4 MB |
| g++ | max_random_00 |
|
232 ms | 5 MB |
| g++ | max_random_01 |
|
211 ms | 5 MB |
| g++ | max_random_02 |
|
192 ms | 5 MB |
| g++ | max_random_yes_00 |
|
216 ms | 5 MB |
| g++ | max_random_yes_01 |
|
217 ms | 5 MB |
| g++ | max_random_yes_prime_00 |
|
302 ms | 5 MB |
| g++ | max_random_yes_prime_01 |
|
301 ms | 5 MB |
| g++ | random_00 |
|
65 ms | 5 MB |
| g++ | random_01 |
|
107 ms | 5 MB |
| g++ | random_02 |
|
142 ms | 5 MB |
| g++ | random_prime_00 |
|
324 ms | 5 MB |
| g++ | random_prime_01 |
|
317 ms | 5 MB |
| g++ | small_00 |
|
2 ms | 4 MB |
| g++ | small_01 |
|
2 ms | 3 MB |
| g++ | small_02 |
|
2 ms | 4 MB |
| clang++ | even_mod_00 |
|
146 ms | 5 MB |
| clang++ | even_mod_01 |
|
181 ms | 5 MB |
| clang++ | even_mod_impossible_00 |
|
2 ms | 4 MB |
| clang++ | even_mod_impossible_01 |
|
2 ms | 4 MB |
| clang++ | example_00 |
|
2 ms | 4 MB |
| clang++ | max_random_00 |
|
233 ms | 5 MB |
| clang++ | max_random_01 |
|
213 ms | 5 MB |
| clang++ | max_random_02 |
|
192 ms | 5 MB |
| clang++ | max_random_yes_00 |
|
220 ms | 5 MB |
| clang++ | max_random_yes_01 |
|
220 ms | 5 MB |
| clang++ | max_random_yes_prime_00 |
|
305 ms | 5 MB |
| clang++ | max_random_yes_prime_01 |
|
304 ms | 5 MB |
| clang++ | random_00 |
|
65 ms | 5 MB |
| clang++ | random_01 |
|
107 ms | 5 MB |
| clang++ | random_02 |
|
143 ms | 5 MB |
| clang++ | random_prime_00 |
|
323 ms | 5 MB |
| clang++ | random_prime_01 |
|
322 ms | 5 MB |
| clang++ | small_00 |
|
2 ms | 4 MB |
| clang++ | small_01 |
|
2 ms | 4 MB |
| clang++ | small_02 |
|
2 ms | 4 MB |