https://codeforces.com/contest/1357/problem/C2
$N$桁の状態$\ket{0\ldots0}$と整数$parity$が与えられるので、立っているbitの数の偶奇が$parity$と等しい状態のみの重ね合わせ状態を作れ
例として、$N=2,\;parity=0$であれば $$\frac1{\sqrt2}\left( \ket{00} + \ket{11} \right)$$ $N=2,\;parity=1$であれば $$\frac1{\sqrt2}\left( \ket{01} + \ket{10} \right)$$ を作れ。
この問題も基本的な解法は前問と同じで、重ね合わせ状態を2つに分け、欲しい方の状態が得られるまで測定を繰り返せばよいです。
ここで、状態をparityで分けるにはparityが1の場合のみ$f(x) = 1$となるようなオラクルが存在すればよく、これはすでに実装済です。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
operation CheckParity (x : Qubit[], y : Qubit) : Unit
{
for (q in x)
{
CNOT(q, y);
}
}
operation Solve (qs : Qubit[], parity : Int) : Unit
{
using (q = Qubit())
{
repeat
{
//parityが1の状態のみqを反転する
ApplyToEach(H, qs);
CheckParity(qs, q);
let res = MResetZ(q);
}
until(res == (parity == 0 ? Zero | One))
fixup
{
ResetAll(qs);
}
}
}
}