题意简述

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

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

输入格式

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

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

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

第二行 'n' 个整数 'a_1, a_2, ..., 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√a_{max})'

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

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

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

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

时间复杂度

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

空间复杂度

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

Python 代码

时间复杂度:'O(nt^2√a_{max})'。

def is_palindrome(arr):
    n = len(arr)
    for i in range(n // 2):
        if arr[i] != arr[n - i - 1]:
            return False
    return True

t = int(input())
for _ in range(t):
    n = int(input())
    a = list(map(int, input().split()))
    max_x = 0
    a_max = max(a)
    for x in range(1, int(a_max ** 0.5) + 1):
        f = [a[i] % x for i in range(n)]
        if is_palindrome(f):
            max_x = x
    if max_x == 0:
        print(0)
    else:
        print(max_x)

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

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