一日一题(22)

链接:http://poj.org/problem?id=2369

图片.png

题意是求一个置换群的群阶。换句话说,求一个排列对自身最少置换几次之后能回到最初排列。

这里有一个比较惯常的思维:将排列[p_1,p_2...p_n],看做点1向p_1连边,点2向p_2连边...点n向p_n连边(边有向)。由于排列中每个元素都不相同,不可能有一个点入度比1大,也不可能入度为0。因此,这样构成的图,是由很多个简单环组成的。

每一次的置换,pos上的数字可以看做是在pos所在的环上移动了一次。因此,对于单个环而言,周期就是环的长度。对于所有环而言,周期就是环长的最小公倍数。

from math import gcd
n=int(input())
a=[0]+list(map(int,input().split()))
vis=[False]*(n+1)

ans=1
for i in range(1,n+1):
    if not vis[i]:
        Cir=0
        p=i
        while not vis[p]:
            vis[p]=True
            p=a[p]
            Cir+=1
        ans*=Cir//gcd(ans,Cir)

print(ans)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容