Problem. N
题意简述:
现在有\([1,c]\)总共\(c\)个数,我们要选择\(n\)个使得任意两个数的异或和不同。
设\(k={\lceil\log_2n\rceil}\),保证\(n2^k\le c\)。
数据范围:
\(c\le2^{24}\)
解法:
考虑\(\operatorname{GF}(2^k)\),我们可以通过打表/爆搜求出其本原多项式\(P(x)\)。
假如我们现在有两个条件\(a+b=c+d,a^3+b^3=c^3+d^3(a\ne b,c\ne d,a,b,c,d\in\operatorname{GF}(2^k))\)。
不难证明有\(ab=cd\)。
此时\(a,b,c,d\)都是方程\(x^2-(a+b)x+ab=0\)的根,但是因为该方程只有两根,那么\(\{a,b\}=\{c,d\}\)。
那么\(\forall i\in[1,2^k)\),我们将\(i2^k+(i^3\bmod P(x))\)加入答案。
由Galois域的相关知识,如果有两对数异或和相等,那么这两对数一定相同。