题目意思:给出一个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; }