posts - 0,comments - 0,trackbacks - 0
号称是置换群的题目。。没看出来哪里像NOIP05年第三题了,这就是所谓的置换群?
顺着枚举 找到1-a-b-c-...-1的一个序列 将这个序列作为一个基元素,那么整个集合每调动一次,基元素就顺时针旋转一格,可知,一个长度为a的序列旋转a次即还原,那么所有的基元素都还原的时候可知整个序列到达初始值。问题就演变成了求每个基元素长度的最小公倍数。
#include<stdio.h>
long n,i,top,w,z;
long f[1001],ans[1001],bj[1001];
long gcd(long a,long b)
{
  
if (b==0)
    
return a;
  
else if (b==1)
    
return 1;
  
if (a<b)
    
return gcd(b,a);
  
return gcd(a%b,b);  
}
long g(long a,long b)
{
  __int64 x,y;
  x
=a;y=b;x*=y;
  z
=gcd(a,b);
  x
/=z;
  z
=x;
  
return z; 
}
long visit(long i)
{
  
long ans;
  ans
=0;
  
while (bj[i]==0)
  {
    bj[i]
=1;
    ans
++;
    i
=f[i];
  }
  
return ans;
}
int main()
{
  scanf(
"%ld",&n);
  
for (i=1;i<=n;i++)
    scanf(
"%ld",&f[i]);
  
for (i=1;i<=n;i++)
  {
    
if (bj[i]==0)
    {
      top
++;
      ans[top]
=visit(i);
    }
  }
  w
=ans[1];
  
for (i=2;i<=top;i++)
    w
=g(w,ans[i]);
  printf(
"%ld",w);
}
posted on 2011-07-05 22:28 梦转千寻 阅读(79) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理