poj 2369
简单置换群
输入n,然后输入n个x表示p(y)=x(1<=x,y<=n);p(p(y))=p(x)...问至少多少次可以使p(y)=y(全部的y)。
所以就是求循环节的问题,而一个循环节里的数置换次数都是一样,p(..(p(y)))=x,然后求各个循环节长度的最小公倍数即可。
#include<stdio.h> #include<string.h> #define N 1010 int perm[N],vis[N]; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int main () { int n,ans,len; int i,j,pos,k; while (scanf("%d,",&n)!=EOF) { for (i=1;i<=n;++i) scanf("%d",&perm[i]); memset(vis,0,sizeof(vis)); ans=1; for (i=1;i<=n;++i) { if (!vis[i]) { pos=i;//++sum,sum为循环节个数 for (len=0;!vis[perm[pos]];++len) { vis[perm[pos]]=1; pos=perm[pos]; } ans=ans/gcd(ans,len)*len; } } printf("%d\n",ans); } return 0; }