Во-первых, 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;
}
Возможно, вам будет легче написать нерекурсивую функцию с пониманием рекурсивной.