//问最少置换多少次变成有序序列
//每个位置都有个循环节 求全部位置循环节的最小公倍数
# include <stdio.h>
# include <algorithm>
# include <string.h>
using namespace std;
int gcd(int x,int y)
{
if(y==0)
return x;
return gcd(y,x%y);
}
int lcm(int x,int y)
{
return x/gcd(x,y)*y;//先除后乘,不会超
}
int main()
{
int n,i,cot,t;
int p[1010],p1[1010];
while(~scanf("%d",&n))
{
for(i=1; i<=n; i++)
scanf("%d",&p[i]);
for(i=1; i<=n; i++)
{
cot=1;
t=p[i];
while(t!=i)
{
cot++;
t=p[t];
}
p1[i]=cot;
}
for(i=2; i<=n; i++) //最小公倍数
{
p1[i]=lcm(p1[i],p1[i-1]);
}
printf("%d\n",p1[n]);
}
return 0;
}
poj 2369 Permutations (置换群)
最新推荐文章于 2020-07-30 18:01:16 发布
本文介绍了如何通过编程解决在数组中找到最少置换次数使其变为有序序列的问题,涉及循环节的概念及其最小公倍数的计算。通过使用C语言实现算法,详细解释了求解过程。

446

被折叠的 条评论
为什么被折叠?



