Задача "Обратные числа"

Обратное число В этой задаче нужно ответить на 1≤t≤10^5 запросов. Каждый запрос состоит из двух целых чисел 2≤p≤10^9 и 0<a<p, число p является простым. На каждый запрос нужно вывести в отдельной строке целое число 0<b<p такое, что (a⋅b−1) ⋮ p.

Входные данные

В первой строке дано целое число t — количество запросов.

В следующих t строках даны по два числа pi и ai, i=1,…,t.

Выходные данные

Выведите t целых чисел (каждое число в отдельной строке) — ответы на запросы.

Примеры Ввод 4

5 1

5 2

5 3

5 4

Вывод 1

3

2

4

Вот мой код:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    unsigned long long _;
    cin >> _;
    for (unsigned long long t = 0; t < _; t++) {
        unsigned long long a, p;
        cin >> p >> a;
        unsigned long long ans = pow(a, p-2);
        cout << ans % p << '\n';
    }

    return 0;
}

Тестирующая система сообщает о неверном ответе.


Ответы (1 шт):

Автор решения: talinuss

Нужна функция возведения в степень, включающая в себя взятие модуля.

#include <cmath>

using namespace std;

unsigned long long modpow(unsigned long long base, unsigned long long exp, unsigned long long modulus) {
  base %= modulus;
  unsigned long long result = 1;
  while (exp > 0) {
    if (exp & 1) result = (result * base) % modulus;
    base = (base * base) % modulus;
    exp >>= 1;
  }
  return result;
}

int main()
{
    unsigned long long _;
    cin >> _;
    for (unsigned long long t = 0; t < _; t++) {
        unsigned long long a, p;
        cin >> p >> a;
        unsigned long long ans = modpow(a, p-2, p);
        cout << ans << '\n';
    }

    return 0;
}
→ Ссылка