POJ 2369

我们知道,当循环长度为L时,置换群幂次为K ,则结果是GCD(L,K)个积相乘。

于是,我们只需要求出每个循环的长度,求得它们的最小公倍数即为解。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

#define LL __int64
#define N 1000
using namespace std;

int stack[N+1],top;
int num[N+1];
bool vis[N+1];

LL gcd(LL a,LL b){
	if(b==0) return a;
	return gcd(b,a%b);
}

int main(){
	int n,tmp;
	while(scanf("%d",&n)!=EOF){
		top=0;
		for(int i=1;i<=n;i++)
		scanf("%d",&num[i]);
		memset(vis,false,sizeof(vis));
		for(int i=1;i<=n;i++){
			tmp=0;
			if(!vis[i]){
				while(!vis[i]){
					vis[i]=true;
					tmp++;
					i=num[i];
				}
				stack[++top]=tmp;
			}
		}
		LL ans=(LL)stack[top];
		for(int i=top-1;i>0;i--){
			ans=ans*(LL)stack[i]/gcd(ans,(LL)stack[i]);
		}
		printf("%I64d\n",ans);
	}
	return 0;
}

  

posted @ 2014-10-15 20:19  chenjunjie1994  阅读(155)  评论(0编辑  收藏  举报