#include <iostream>

int jacobi(int q, int p)
{
    int s = 0, u = q, v = p;
    int r, k, t;
    do{
        // Вычисляем r - наименьший положительный остаток при делении u на v
        r = u % v;
        // Вычисляем целое r >= 0 и нечетное t: r = t * 2^k
        k = t = 0;
        while(r & 0x1 == 0) // Пока r делится на 2
        {
            k++;    // Выделяем степень двойки в числе r
        }
        // Используем t для вычисления 2^k при помощи битовых сдвигов
        t = 1;  // Единицу умножаем на степень двойки (следующая строка)
        t <<= k;
        //t = r / t;  // Разделили r на 2^k, теперь в t результат этого деления
        t = r / t;  // Разделили r на 2^k, теперь в t результат этого деления
        s = (s + k * (v*v - 1) / 8 + (t - 1) * (v - 1) / 4) % 2;
        if(t == 1)
            return (s == 1) ? -1 : 1;
        u = v;
        v = t;
    }while(t >= 3);
}

int main() {
    std::cout << jacobi(184, 347) << std::endl;
    return 0;
}