题目:
题意解析:
现在有一个数组 a,和 n 个非负整数,定义 f(a,x)=[a1modx,a2modx,…,anmodx],其中 x 为正整数。现要你找到最大的 x,使得 f(a,x) 是回文的。
这里,amodx 的含义为 a 除以 x 得到的余数。
我们认为一个数组是回文的,当且仅当从前往后读得到的结果和从后往前读得到的结果完全相同。换句话说,一个长度为 n 的数组 a 是回文的,当且仅当 ∀1≤i≤n,有 ai=an−i+1。
题解:
(1)这个题目就是要不断缩小ans,但是缩小ans,不是随便缩小的,要不断取ans和a[i]-a[n-i+1]的差值的最大公约数。
(2)为什么要取最大公约数,因为要满足每一对数的差值,每一对数的差值必须能把这个数整除。才能保证数组最后是回文的。
代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,k;
int main() {
cin>>t;
while(t--) {
cin>>n;
long long int a[n+10];
for(int i=1; i<=n; i++) {
cin>>a[i];
}
long long int ans=llabs(a[1]-a[n]);
for(int i=2;i<=n/2;i++){
ans=__gcd(ans,llabs(a[i]-a[n-i+1]));
}
cout<<ans<<endl;
}
return 0;
}