傳送門
學過 \(fwt\) 看到操作 \(2\) 不難可以聯想到 \(fwt\)
考慮一遍 \(\oplus\)
\(fwt\) 會把 \(a_t\) 變成什麼
\(a_t'=((-1)^+(-1)^)a_x\)
考慮這個東西 \((-1)^+(-1)^\)
當 \(bitcount(x\&t)\) 和 \(bitcount(y\&t)\) 同奇偶時才有值
實際上就是 \(bitcount((x\oplus y)\&t)\) 為偶數
而只需要知道互不相關的 \(n\) 個 \(t\) 就可以解出 \(x\oplus y\)
並且題目又是隨機的,那麼期望做 \(o(n)\) 遍,詢問次數期望 \(o(n^2)\)
乙個小細節,\(fwt\) 矩陣為 \(a=\begin1 & 1 \\ 1 & -1\end\),這玩意兒並不滿足 \(aa^t=i\)
但是它滿足 \(aa^t\begin\frac & 0 \\ 0 & \frac\end=i\)
所以只要令 \(a=\begin\frac} & \frac} \\ \frac} & -\frac}\end\) 就好了
# include "quantumbreak.h"
# include using namespace std;
typedef long long ll;
const double sq(1.0 / sqrt(2));
static vector zero;
static double a[2][2];
static int cnt[1 << 20];
inline int check(int v, int n)
int query_xor(int n, int t)
for (i = 1; i < s; ++i) if (check(i, n)) return i;
return 233;
}
uoj328 UTR 3 量子破碎
有乙個長度為 2 n 下標依次為 0,1,ldots,2 n 1 的陣列,你要和互動庫進行若干輪操作。每次操作開始時,陣列裡只有 a x a y frac x neq y 剩下的元素都是0。你要和互動庫進行多次互動,求出 x oplus y 的值 保證操作過程中 x oplus y 不變 你可以進行...