Poj2369 Permutations(置换群最小还原次数)

题意:

给定置换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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/107351158