Permutation Swap
题意:
给一个排列,a[i] != i,要求找到一个最大的k,你可以交换a[i]和a[i + k],使得a[i] == i。
思路:
找到每一个数的交换长度abs(a[i] - i),求gcd即可。
代码:
/*************************************************************************
> File Name: b.cpp
> Author: Beans
> Mail: 3112748286@qq.com
> Created Time: 2023/5/15 10:16:16
************************************************************************/
#include <iostream>
#include <algorithm>
#define endl '\n'
using namespace std;
const int maxn = 3e5 + 7;
int t, n, 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 = abs(a[1] - 1);
for(int i = 2; i <= n; i ++ )
ans = gcd(ans, abs(a[i] - i));
cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> t;
while(t -- )
solve();
}