Задача Обратные числа C++
Обратное число
В этой задаче нужно ответить на 1≤t≤105 запросов. Каждый запрос состоит из двух целых чисел 2≤p≤109 и 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
cpp
#include <cmath>
using namespace std;
int pow_plus(int a, int b){
int z = pow(b, a - 2);
return z % a;
}
int main()
{
int n;
int a,b;
cin >> n;
int mas[n];
for(int i = 0; i < n; i++){
cin >> a;
cin >> b;
mas[i] = pow_plus(a,b);
}
for(int i = 0; i < n; i++){
cout << mas[i];
if(i + 1 != n){
cout <<'\n';
}
}
setlocale(LC_ALL, "rus");
return 0;
}
Вердикт: Неверный ответ, почему не работает?
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
В комментарий не лезет...
Вот, как-то набрасывал для себя такую функцию - возведения в степень по модулю...
//// Быстрое возведение в степень по модулю p
template<typename T, typename U, typename P,
typename = std::enable_if_t<std::is_integral<T>::value &&
std::is_unsigned<P>::value &&
std::is_unsigned<U>::value>
>
T iqpow(T x, U e, P p)
{
T res = static_cast<T>(1);
x %= p;
for(;e;e>>=1)
{
if (e&1) res = (res*x)%p;
x = (x*x)%p;
}
return res;
}