Permutations

题目链接:

题目意思:给出一个n长度的序列,按照这个序列进行置换操作,问最小的循环节长度(即起始是1234....n,终也是1234....n)

solve:我们只要求出每个位置的最小循环节就行了,然后求所有位置的最小公倍数,就是总的最小循环节

#pragma GCC optimize("O3")
#include <cstdio>
//#include <tr1/unordered_map>
using namespace std;
#define ll long long
#define fi first
#define se second
#define re register
#define pb push_back
const int N=1e6+10;
const int mod=1e9+7;
void read(int &a)
{
    a=0;int d=1;char ch;
    while(ch=getchar(),ch>'9'||ch<'0')
        if(ch=='-')
            d=-1;
    a=ch^48;
    while(ch=getchar(),ch>='0'&&ch<='9')
        a=(a<<3)+(a<<1)+(ch^48);
    a*=d;
}
int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
int a[N];
int main()
{
    int n;
    read(n);
    for(re int i=1;i<=n;i++) read(a[i]);
    int ans=1;
    for(re int i=1;i<=n;i++)
    {
        int t=i;
        int cnt=1;
        while(a[t]!=i)
        {
            t=a[t];
            cnt++;
        }
        if(cnt) ans=ans/gcd(ans,cnt)*cnt;
    }
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/acm1ruoji/p/12201225.html