题意:
给定置换T,问最少进行多少次T置换多少次能够还原到{1,2,3…,n}
数据范围:n<=1e3
解法:
两个结论:
1.在置换群中有一个定理:设 Tk=e,(T为一置换,e为单位置换(映射函数为f(x)=x的置换)),那么k的最小正整数解是T的拆分的所有循环长度的最小公倍数。
2.或者有个更一般的结论:设 Tk=e,(T为一循环,e为单位置换),那么k的最小正整数解为T的长度。
具体证明得看论文
code:
#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
#define int long long
const int maxm=1e3+5;
int mark[maxm];
int a[maxm];
int n;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b){
return a/gcd(a,b)*b;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
vector<int>cir;
for(int i=1;i<=n;i++){
if(!mark[i]){
int cnt=0;
int x=i;
while(!mark[x]){
mark[x]=1;
cnt++;
x=a[x];
}
cir.push_back(cnt);
}
}
int ans=cir[0];
for(int i=1;i<(int)cir.size();i++){
ans=lcm(ans,cir[i]);
}
cout<<ans<<endl;
return 0;
}