https://codeforces.com/contest/1357/problem/A1
2 qubitに対する演算$unitary$が与えられ、ここで$unitary$は${\rm CNOT_{12}}$または${\rm CNOT_{21}}$である。$unitary$を一度だけ呼び出して、それが${\rm CNOT_{12}}$ならば0を、${\rm CNOT_{21}}$ならば1を返せ。
${\rm CNOT_{12}}$と${\rm CNOT_{21}}$はどちらも${\rm CNOT}$ゲートですが、制御bitとターゲットbitが入れ替わっており、これらを識別するためには与えられた演算を状態$\ket{11}$に作用させればよく、
$${\rm CNOT_{12}}\ket{11} = \ket{10}$$ $${\rm CNOT_{21}}\ket{11} = \ket{01}$$ より、どちらのqubitを測定しても演算を識別することができます。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
operation Solve (unitary : (Qubit[] => Unit is Adj+Ctl)) : Int
{
//|11>を入力して、|10>になれば0, |01>になれば1
mutable res = 0;
using (qs = Qubit[2])
{
ApplyToEach(X, qs);
unitary(qs);
if (M(qs[0]) == Zero)
{
set res = 1;
}
ResetAll(qs);
}
return res;
}
}