https://codeforces.com/contest/1357/problem/A3
1 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$H$または$X$である。$unitary$を二度まで呼び出して、それが$H$ならば0、 $X$ならば1を返せ。
$H,\;X$がともに自身を逆演算にもつ演算であることに注目します。また、$X\ket{+} = \ket{+}$であることから \begin{align*} HXH\ket{0} &= HX\ket{+} \\ &= H\ket{+} \\ &= \ket{0} \end{align*} \begin{align*} XXX\ket{0} &= X\ket{0} \\ &= \ket{1} \end{align*} となります。
よって、$UXU\ket{0}$に対してPauli Zを対角とする測定を行い、$\ket{0}$が得られれば$U = H$、$\ket{1}$が得られれば$U = X$であると判断できます($U$は与えられた演算)
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Intrinsic;
operation Solve (unitary : (Qubit => Unit is Adj+Ctl)) : Int
{
//UXU|0>を測定して|0>ならH, |1>ならX
using (q = Qubit())
{
unitary(q);
X(q);
unitary(q);
return MResetZ(q) == Zero ? 0 | 1;
}
}
}