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域的相关知识,如果有两对数异或和相等,那么这两对数一定相同。

posted @ 2020-05-15 23:02  Shiina_Mashiro  阅读(155)  评论(0编辑  收藏  举报