题意简述

给定一个长度为 $n$ 的非负整数数组 $a$,定义 $f(a,x) = [a_1 \bmod x, a_2 \bmod x, \ldots, a_n \bmod x]$,求最大的 $x$,使得 $f(a,x)$ 是回文序列。

回文序列的定义:对于长度为 $n$ 的数组 $a$,如果 $\forall i \in [1,n]$,有 $a_i = a_{n-i+1}$,则数组 $a$ 是回文序列。

输入格式

第一行一个整数 $t$,表示测试用例的数量。

接下来 $t$ 行,每行格式如下:

第一行一个整数 $n$,表示数组 $a$ 的长度。

第二行 $n$ 个整数 $a_1, a_2, \ldots, a_n$,表示数组 $a$ 的元素。

输出格式

对于每个测试用例输出一行一个整数,表示最大的 $x$,使得 $f(a,x)$ 是回文序列。如果 $x$ 可以取到无穷大,则输出 $0$。

输入样例

4 2 1 2 8 3 0 1 2 0 3 2 1 1 0 3 100 1 1000000000

输出样例

1 2 0 999999900

算法

(暴力枚举) $O(nt^2\sqrt{a_{max}})$

如果 $x$ 非常大的话,我们可以考虑 $x$ 在什么情况下可以取到无穷大。

如果对于任意的 $x$,$f(a,x)$ 都不是回文序列,那么 $x$ 可以取到无穷大。

反之,如果存在某个 $x$,使得 $f(a,x)$ 是回文序列,那么对于所有 $x' \ge x$,$f(a,x')$ 一定也是回文序列。

我们考虑暴力枚举 $x$,枚举的上界可以设为 $\sqrt{a_{max}}$。然后对于每个 $x$,计算出 $f(a,x)$,判断是否是回文序列即可。

时间复杂度

总共有 $nt$ 个测试用例,对于每个测试用例,需要枚举至多 $\sqrt{a_{max}}$ 个 $x$,需要花费 $O(n)$ 的时间计算 $f(a,x)$,判断是否是回文序列需要花费 $O(n)$ 的时间,因此时间复杂度是 $O(nt^2\sqrt{a_{max}})$。

空间复杂度

空间复杂度是 $O(n)$。

Python 代码

时间复杂度:$O(nt^2\sqrt{a_{max}})$


原文地址: https://www.cveoy.top/t/topic/ejbp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录