数论-线性基
線性基基基基基
求 \(k\) 小異或的高斯消元方法不是很懂,可能暫時也沒功夫去學了,先來一發可以感性理解的線性基板子。
從高位到低位貪心。
性質:
求向量組 \(a\) 的線性基 \(p\)
for (int i = 1; i <= N; ++i) {for (int j = 62; j >= 0; --j)if ((A[i]) >> j) & 1) {if (!P[j]) {P[j] = A[i];break;}A[i] ^= P[j];}}求最大值
int mx = 0;for (int i = 62; i >= 0; --i)if ((mx ^ P[i]) > mx)mx ^= P[i];求最小值
就是 \(p_0\) 。
第 \(k\) 小異或值
構造只有 \(p_i\) 的第 \(i\) 位為 \(1\) 的線性基。據說如果新的線性基大小(非 \(0\) 向量個數)等于原線性基,則仍然無法構造 \(0\) ,否則可以。
for (int i = 62; i >= 0; --i) {for (int j = i - 1; j >= 0; --j)if ((P[i] >> j) & 1)P[i] ^= P[j];}int x = -1;for (int i = 0; i <= 62; ++i)if (P[i])P[++x] = P[i];}上面的構造完成之后,就可以求 \(a\) 的第 \(k\) 小異或值了。
for (int i = 62; i >= 0; --i)if ((k >> i) & 1)ans ^= P[i];判斷向量是否能被構造
for (int i = 62; i >= 0; --i)if ((x >> i) & 1)x ^= P[i];if (!x)suc = 1;轉載于:https://www.cnblogs.com/ghcred/p/10491468.html
總結
- 上一篇: mysql 删除重复记录,只保留id字
- 下一篇: js中的arguments 参数