Ответы пользователя по тегу C++
  • Как реализовать такой алгоритм?

    @X_Warlock
    Во-первых, long - это int32, так что если у вас mod больше 2^15, лучше всё-таки взять long long.
    Во-вторых, строчку
    S = (S * c) % mod;
    следует заменить на
    c*=base;
    c%=mod;
    c*=c;
    c%=mod;
    (если вы хотите следовать алгоритму), кроме того, поставить условие на то, что temp[i] - это не последний бит битовой записи числа - иначе мы лишний раз поднесём к квадрату

    Следующий код работает правильно:
    long long bp(long long base, long long power)
    {
      std::vector<bool> temp = toBinary(power);
      std::vector<long> result;
      long long c = 1;
    
      for (auto i = 0; i<temp.size(); i++)
      {
        if (temp[i] == 1)
        {
          c = (c*base)%mod;
        }
        if(i!=temp.size()-1)
            c*=c;
        c%=mod;
      }
      return c;
    }


    Я не понял смысла переменной S, если объясните, возможно, ваш код получится править "мягче" (кажется, я переписал половину вашего кода, извините)

    Вообще говоря, функция бинарного возведения в рекурсивном виде выглядит так:
    long long binpow(long long base, long long power)
    {
        if(power==0)
            return 1;
        if(power%2)
            return (binpow(base, power-1)*base)%mod;
        long long tmp = binpow(base, power/2);
        return (tmp*tmp)%mod;
    }

    Возможно, вам будет легче написать нерекурсивую функцию с пониманием рекурсивной.
    Ответ написан
    Комментировать
  • Что значит эта строка(с++)?

    @X_Warlock
    Вероятно, это функция, которая принимает указатель на массив float-ов и размер массива.
    (тип size_t - целочисленный тип, предназначен специально для указания размеров контейнеров и массивов)
    Ответ написан
    Комментировать