Вычисление a^b^c по модулю 10^9+7

Ссылка на проблему — https://cses.fi/problemset/task/1712

вход -

1
7
8
10
  • Ожидаемый результат - 928742408
  • Мой вывод - 989820350

момент, который меня смущает. Из 100 входных данных только в 1 или 2 тестовых случаях мой код выдает неправильный вывод, если код неправильный, разве он не должен давать неправильный вывод для всего?

Мой код -

#include <iostream>
#include <algorithm>

typedef unsigned long long ull;
constexpr auto N = 1000000007;

using namespace std;

ull binpow(ull base, ull pwr) {
    base %= N;
    ull res = 1;
    while (pwr > 0) {
        if (pwr & 1)
            res = res * base % N;
        base = base * base % N;
        pwr >>= 1;
    }
    return res;
}

ull meth(ull a, ull b, ull c) {
    if (a == 0 && (b == 0 || c == 0))
        return 1;
    if (b == 0 && c == 0)
        return 1;
    if (c == 0)
        return a;

    ull pwr = binpow(b, c);
    ull result = binpow(a, pwr);

    return result;
}

int main() {

    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ull a, b, c, n;
    cin >> n;

    for (ull i = 0; i < n; i++) {
        cin >> a >> b >> c;
        cout << meth(a, b, c) << "\n";
    }
    return 0;
}
`

person Chitransh Saxena    schedule 28.05.2020    source источник
comment
Если я не ошибаюсь, b^c нужно считать mod N-1, а не mod N. Порядок группы кратности GF(N) равен N-1   -  person Damien    schedule 28.05.2020
comment
только в 1 или 2 тестовых примерах мой код выдает неверный вывод --› Какой другой неверный вывод?   -  person chux - Reinstate Monica    schedule 28.05.2020
comment
если код неверен, разве он не должен давать неправильный вывод для всего? - Точно нет. Неправильный код всегда выдает правильные результаты. То, что это неправильно, не означает, что он всегда должен выводить неверный результат.   -  person BessieTheCookie    schedule 28.05.2020
comment
Идея состоит в том, что x^(N-1) = 1 mod N, если N простое число.   -  person Damien    schedule 28.05.2020
comment
@Дэмиен, да, сработало   -  person Chitransh Saxena    schedule 28.05.2020


Ответы (2)


Ваше решение основано на неверном математическом предположении. Если вы хотите вычислить abc по модулю m, вы не можете уменьшить показатель степени bc по модулю 109. +7. Другими словами, abc mod m != abc mod m mod m. Вместо этого вы можете уменьшить мод до 109+6, что работает из-за Маленькая теорема Ферма. Следовательно, вам нужно вычислить показатель степени bc по другому модулю.

person BessieTheCookie    schedule 28.05.2020

Для справки


Сдача

ull pwr = binpow(b, c);

К расчету pwr = bc.

810 --> 1 073 741 824

71 073 741 824 mod 100000007 --> 928742408


если код неверен, разве он не должен давать неправильный вывод для всего?

Вероятно, другие bc всегда были ‹ 100000007.

person Community    schedule 28.05.2020
comment
Это очень быстро переполнится, так как числа в задаче могут достигать 1e9. - person BessieTheCookie; 28.05.2020
comment
@BessieTheCow Достаточно честно. Тем не менее, цель состоит в том, чтобы указать, что не так. До ОП, чтобы исправить. - person chux - Reinstate Monica; 28.05.2020
comment
Это сработало, уменьшив мой мод до мод-1 для расчета мощности. - person Chitransh Saxena; 28.05.2020