Lunatic Never Content
题意:
给一个数组,要求找到一个x,使得数组中每个数mod x之后回文,x尽可能大。
思路:
找到对称的数,如果要mod x之后相等,x = abs(a[i] - a[n - i + 1]),这样mod之后两个数就会相等,因为x要大,所有对每对数的x求gcd即可。
代码:
#include <iostream>
#include <algorithm>
#define int long long
#define endl '\n'
using namespace std;
const int maxn = 3e5 + 7;
const int inf = 0x3f3f3f3f;
int t, n;
int a[maxn];
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
void solve(){
cin >> n;
for(int i = 1; i <= n; i ++ )
cin >> a[i];
int ans = inf;
for(int i = 1; i <= n / 2; i ++ )
if(a[i] != a[n - i + 1])
if(ans == inf) ans = abs(a[i] - a[n - i + 1]);
else ans = gcd(ans, abs(a[i] - a[n - i + 1]));
if(ans == inf) cout << 0 << endl;
else cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> t;
while(t -- )
solve();
}