UOJ 328 UTR 3 量子破碎

2022-05-07 18:33:13 字數 996 閱讀 8616

傳送門

學過 \(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 不變 你可以進行...