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

浙公网安备 33010602011771号