Submission details
Task:Finding inverse
Sender:ind1f
Submission time:2025-11-17 17:26:55 +0200
Language:C++ (C++17)
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.00 sdetails
#2ACCEPTED0.00 sdetails
#3ACCEPTED0.00 sdetails
#4ACCEPTED0.00 sdetails
#5ACCEPTED0.00 sdetails
#6ACCEPTED0.00 sdetails
#7ACCEPTED0.00 sdetails
#8ACCEPTED0.00 sdetails
#9ACCEPTED0.00 sdetails
#10ACCEPTED0.00 sdetails
#11ACCEPTED0.00 sdetails
#12ACCEPTED0.00 sdetails
#13ACCEPTED0.00 sdetails
#14ACCEPTED0.00 sdetails

Compiler report

input/code.cpp: In function 'int main()':
input/code.cpp:57:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for (int i = 0; i < p.size(); i++) {
      |                     ~~^~~~~~~~~~

Code

#include <iostream>
#include <numeric>
#include <vector>

using namespace std;

void add(int &a, int b, int m) {
  a += b;
  if (a >= m) {
    a -= m;
  }
}

int mul(int a, int b, int m) {
  return 1LL * a * b % m;
}

int mod_pow(int a, int b, int m) {
  int r = 1;
  for (; b > 0; a = mul(a, a, m), b >>= 1) {
    if (b & 1) {
      r = mul(r, a, m);
    }
  }
  return r;
}

int a, m;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> a >> m;
  if (gcd(a, m) != 1) {
    cout << -1 << '\n';
    return 0;
  }
  // calc phi(m)
  // ans = a^(phi(m) - 1)
  // factorize m first
  vector<int> p;
  int q = m;
  for (int i = 2; i * i <= q; i++) {
    if (q % i == 0) {
      p.emplace_back(i);
      while (q % i == 0) {
        q /= i;
      }
    }
  }
  if (q > 1) {
    p.emplace_back(q);
  }
  long long ans = m;
  for (int mask = 1; mask < (1 << p.size()); mask++) {
    int pr = 1;
    for (int i = 0; i < p.size(); i++) {
      if (mask >> i & 1) {
        pr *= p[i];
      }
    }
    if (__builtin_popcount(mask) & 1) {
      ans -= m / pr;
      ans %= (m - 1);
      if (ans < 0) {
        ans += m - 1;
      }
    } else {
      ans += m / pr;
      ans %= (m - 1);
    }
  }
  ans--;
  if (ans < 0) {
    ans += m - 1;
  }
  cout << mod_pow(a, ans, m) << '\n';
  return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
6 7

correct output
6

user output
6

Test 2

Verdict: ACCEPTED

input
0 7

correct output
-1

user output
-1

Test 3

Verdict: ACCEPTED

input
5 78

correct output
47

user output
47

Test 4

Verdict: ACCEPTED

input
89 99

correct output
89

user output
89

Test 5

Verdict: ACCEPTED

input
0 61

correct output
-1

user output
-1

Test 6

Verdict: ACCEPTED

input
897 947

correct output
625

user output
625

Test 7

Verdict: ACCEPTED

input
419 538

correct output
217

user output
217

Test 8

Verdict: ACCEPTED

input
32 938

correct output
-1

user output
-1

Test 9

Verdict: ACCEPTED

input
184120 505187

correct output
438779

user output
438779

Test 10

Verdict: ACCEPTED

input
264601 885661

correct output
360221

user output
360221

Test 11

Verdict: ACCEPTED

input
40310 590135

correct output
-1

user output
-1

Test 12

Verdict: ACCEPTED

input
202254499 577081420

correct output
128866679

user output
128866679

Test 13

Verdict: ACCEPTED

input
539836073 888851205

correct output
797044652

user output
797044652

Test 14

Verdict: ACCEPTED

input
697847215 756971670

correct output
-1

user output
-1