1. 程式人生 > >置換群及其應用

置換群及其應用

sig lan dsta 給定 for 介紹 https 超級 while

置換群是由置換組成的群。即n元集合Ω到它自身的一個一一映射

稱為Ω上的一個n元置換或n階置換

Ω上的置換 技術分享圖片 可表示為

技術分享圖片

典型例題是POJ2369,給定一個序列,問需要最少需要置換多少次才能變為有序序列

技術分享圖片

有了這個定理就可以做題了,我們求出每一個數的最小循環節,求LCM就好了

介紹一下什麽是循環節:

1 2 3 4 5

4 1 5 2 3

1->4->2->1

(1,4,2)為一個循環節,長度為3

 1 #include<cstdio>
 2 const int maxn=1005;
 3 int n;
 4 int a[maxn];
 5 int gcd(int a,int
b) 6 { 7 return b==0?a:gcd(b,a%b); 8 } 9 int lcm(int a,int b) 10 { 11 return a/gcd(a,b)*b; 12 } 13 int main() 14 { 15 while(scanf("%d",&n)==1) 16 { 17 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 18 int ans=1; 19 for(int i=1;i<=n;i++) 20 { 21
int tmp=a[i]; 22 int cnt=1; 23 while(tmp!=i) 24 { 25 tmp=a[tmp]; 26 cnt++; 27 } 28 ans=lcm(ans,cnt); 29 } 30 printf("%d",ans); 31 } 32 return 0; 33 }

超級超級簡單的模擬

置換群及其應用