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