1. 程式人生 > >組合數學——置換群

組合數學——置換群

置換群

題解:求出每個數的迴圈節,求最小公倍數即可。

//置換群 
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e3+10;
int p[N];

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

int lcm(int a,int b){
	return a/gcd(a,b)*b;
}

int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&p[i]);
	int ans=1,tmp,cnt; 
	for(int i=1;i<=n;i++){
		int tmp=p[i];
		cnt=1;
		while(tmp!=i){
			cnt++;
			tmp=p[tmp];
		}
		//printf("%d\n",cnt);
		ans=lcm(ans,cnt);
	}
	printf("%d\n",ans);
	return 0;
}