def build_circuit(n: int, f: Callable[([str], str)]) -> QuantumCircuit:
    zero = np.binary_repr(0, n)
    b = f(zero)
    input_qubit = QuantumRegister((n + 1), 'qc')
    classicals = ClassicalRegister(n, 'qm')
    prog = QuantumCircuit(input_qubit, classicals)
    prog.x(input_qubit[n])
    prog.h(input_qubit[1])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.x(input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.h(input_qubit[1])
    prog.cz(input_qubit[2], input_qubit[1])
    prog.rx(0.17592918860102857, input_qubit[2])
    prog.rx((- 0.3989822670059037), input_qubit[1])
    prog.h(input_qubit[1])
    prog.h(input_qubit[1])
    prog.cz(input_qubit[2], input_qubit[1])
    prog.h(input_qubit[1])
    prog.y(input_qubit[1])
    prog.h(input_qubit[1])
    prog.cz(input_qubit[2], input_qubit[1])
    prog.h(input_qubit[1])
    prog.z(input_qubit[2])
    prog.z(input_qubit[1])
    prog.x(input_qubit[1])
    prog.y(input_qubit[2])
    prog.x(input_qubit[2])
    for i in range(n):
        prog.h(input_qubit[i])
    prog.h(input_qubit[n])
    prog.barrier()
    oracle = build_oracle(n, f)
    prog.append(oracle.to_gate(), ([input_qubit[i] for i in range(n)] + [input_qubit[n]]))
    for i in range(n):
        prog.h(input_qubit[i])
    prog.barrier()
    return prog
def build_circuit(n: int, f: Callable[([str], str)]) -> QuantumCircuit:
    zero = np.binary_repr(0, n)
    b = f(zero)
    input_qubit = QuantumRegister((n + 1), 'qc')
    classicals = ClassicalRegister(n, 'qm')
    prog = QuantumCircuit(input_qubit, classicals)
    prog.x(input_qubit[n])
    prog.h(input_qubit[1])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.x(input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.cx(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.h(input_qubit[2])
    prog.cz(input_qubit[0], input_qubit[2])
    prog.h(input_qubit[2])
    prog.h(input_qubit[1])
    prog.cz(input_qubit[2], input_qubit[1])
    prog.rx(0.17592918860102857, input_qubit[2])
    prog.rx((- 0.3989822670059037), input_qubit[1])
    prog.h(input_qubit[1])
    prog.h(input_qubit[1])
    prog.cz(input_qubit[2], input_qubit[1])
    prog.h(input_qubit[1])
    prog.y(input_qubit[1])
    prog.h(input_qubit[1])
    prog.cz(input_qubit[2], input_qubit[1])
    prog.h(input_qubit[1])
    prog.z(input_qubit[2])
    prog.z(input_qubit[1])
    prog.x(input_qubit[1])
    prog.y(input_qubit[2])
    prog.x(input_qubit[2])
    for i in range(n):
        prog.h(input_qubit[i])
    prog.h(input_qubit[n])
    prog.barrier()
    oracle = build_oracle(n, f)
    prog.append(oracle.to_gate(), ([input_qubit[i] for i in range(n)] + [input_qubit[n]]))
    for i in range(n):
        prog.h(input_qubit[i])
    prog.barrier()
    return prog