【日总结】2022.12.5
学了一周 whk,滚回来 OI 了。
今天啥都没干,颓了一天。
[ARC152E] Xor Annihilation
感觉很强。
题目看起来很复杂,所以我们要想办法转换题意。注意到所有的值异或和为 \(0\),那么假如某个球左面的权值异或和为 \(L\),那么右面的权值异或和 \(R=L \oplus w_i\)。于是我们可以尝试先对权值进行前缀异或和,设 \(p_i\) 为前 \(i\) 个数的异或和,那么 \(L=p_{i-1},R=p_{i}\)。
考虑当两个球 \(i,i+1\) 合并后,得到的新球的 \(L=p_{i-1}, R=p_{i+1}\),那么实际上就是把 \(p_i\) 删除掉了。而两个球能够合并,说明 \(p_{i-1} \le p_i\) 且 \(p_i \ge p_{i+1}\) 且 \(p_{i-1} \ne p_{i+1}\),也就是只要有凸起那么就会被删掉。那么最后肯定会删的只剩一个下凸的形状或者是平的。因为 \(p_0=p_{n+1}=Z\),那么如果所有 \(p_i\) 的最小值 \(=Z\),那么最后会停止,否则不会停止。
那么我们就是要求有多少 \(Z\) 满足对于所有的 \(p_i\),\(Z \ge (Z \oplus p_i)\),这等价于 \(p_i\) 的最高位在 \(Z\) 上为 \(0\),那么我们只需要统计有多少个位必须填 \(0\),剩下的随便填即可。
mod M 大礼包
mod M
给定一个序列 \(\{a_n\}\),选取一个数 \(m \ge 2\),使得将所有的 \(a_i \gets a_i \bmod m\) 后,最小化互不相同的 \(a_i\) 数。
\(n \le 2\times 10^5,a_i \le 10^9\)
最弱智的一个。
首先观察可以发现,如果将所有数\(\bmod 2\) 后,不同的数只有 \(2\) 个,所以答案上界就是 \(2\)。我们只需要寻找是否存在一个 \(m\) 使得所有的 \(a_i \bmod m\) 都相等即可。
有一个技巧:\(a_i \equiv a_j \pmod m\) 等价于 \(m\mid \mathrm{abs}(a_i-a_j)\)。那么假如所有数相等,我们只需要\(\bmod \gcd\limits_{i=1}^{n-1}\mathrm{abs}(a_{i+1}-a_i)\) 就可以了。所以我们只需要判断一下这个数是否不等于 \(1\) 即可。
Yet Another mod M
给定一个序列 \(\{a_n\}\),选取一个数 \(m \ge 3\),使得将所有的 \(a_i \gets a_i \bmod m\) 后,存在主元素(出现次数多于一半的数)。输出任意一个 \(m\)。若无解,输出 \(-1\)。
\(n \le 5000,a_i \le 10^9\)
官方题解给的是随机化算法:
首先同样的,主元素中肯定存在很多相等的数对,而这样相等的数对数量大约占所有数的 \(1 \over 4\),所以我们可以每次随机选出两对数,然后枚举 \(\mathrm{abs}(a_i-a_j)\) 的所有因子,再判断一下是不是即可。
用户题解里给出了一个优美的确定性算法。
我们发现,由于这个主元素出现次数大于一半,那么绝大部分情况下都存在相邻两个数相等,而只有当 \(n\) 为奇数时,有可能会不存在相邻的两个数相等(例如 \(1,2,1,3,1,4,1\)),那么此时第一个数一定与最后一个数相等。那么这样我们就只需要判断这 \(n\) 个差是否合法即可。
F**king Another mod M(?
gtm1514 给我的,不知道哪里的题。
给定一个序列 \(\{a_n\}\),选取一个数 \(m\),使得将所有的 \(a_i \gets a_i \bmod m\) 后,数字互不相同。求最小的 \(m\)。
\(n \le 10^6,a_i \le 10^6\)(注意值域)
互不相同就相当于 \(m\) 不是任意一个 \(\mathrm{abs}(a_i-a_j)\) 的因子。而 \(\mathrm{abs}(a_i-a_j)\) 的值域只有 \(10^6\),所以考虑可以用 FFT 求出所有 \(a_i-a_j\) 的取值。
具体就令 \(A_j\) 为 \(a_i=j\) 的出现次数,\(B_{n-i}=A_{i}\),那么 \(C_{i-j+n}=\sum A_iB_{n-j}\),直接 FFT 就行了。
然后我们知道了所有 \(\mathrm{abs}(a_i-a_j)\),那么只需要标记出他们的所有因子即可。直接枚举是 \(O(n \sqrt n)\) 的,可以通过枚举因子的倍数做到 \(O(n \log n)\)。