https://codeforces.com/contest/1356/problem/A2
1 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$I$ゲートもしくは$Z$ゲートである。$unitary$を一度だけ呼び出して、$I$であれば0を、$Z$であれば1を返せ。
$$Z = \ket{0}\bra{0} - \ket{1}\bra{1}$$ であり、これは$\ket{1}$の符号を反転させる演算なので、これを状態$\ket{+}$に作用させると \begin{align*} Z\ket{+} &= \frac{1}{\sqrt{2}}Z\left( \ket{0} + \ket{1]} \right) \\ &= \frac{1}{\sqrt{2}}\left( \ket{0} - \ket{1]} \right) \\ &= \ket{-} \end{align*} となります。
よって、与えられた演算を$\ket{+}$に対して作用させた後にPauli Xを対角とする測定を行い、$\ket{+}$が得られれば$I$、$\ket{-}$が得られれば$Z$と判断すればよいです。
namespace Solution {
open Microsoft.Quantum.Intrinsic;
operation Solve (unitary : (Qubit => Unit is Adj+Ctl)) : Int {
mutable res = 0;
using (q = Qubit())
{
// 与えられたoperationを|+>に作用させる
H(q);
unitary(q);
// 測定をして、|+>ならI、|->ならZ
if (Measure([PauliX], [q]) == One)
{
set res = 1;
}
Reset(q);
}
return res;
}
}