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;
}

 

posted @ 2012-11-27 17:18  _hikaru__  阅读(245)  评论(0编辑  收藏  举报