poj 1721 CARDS 置换群
没看到题目上说 仅一个循环因子.. 现在我还是没看到.....
WA了好久, 一直用 置换群分解循环因子后,对每一个循环因子 其 阶数即为循环节. 之后无限WA..
找了好久.才发现. 这里的置换, 每一次 double shuffer 后. 其循环因子顺序已经改变了. 我们使用循环因子的顺序是相对于最初的情况而言.
所以这里不能够用循环因子来做.
模拟其置换过程,找出其 置换循环 D, 对于置换X经过S次置换后得到Y, 则 Y再经过 D-S%D 次置换后又回到 X.
View Code
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> using namespace std; const int N = 1010; int a[N], b[N],c[N], vis[N]; int n, k, num; int init(){ int cnt = 0; while( 1 ) { for(int i = 1; i <= n; i++) b[i] = c[ c[i] ]; cnt++; bool flag = true; for(int i = 1; i <= n; i++) if( b[i] != a[i] ) { flag = false; break; } if(flag) break; for(int i = 1; i <= n; i++) c[i] = b[i]; } return cnt; } int main() { while( scanf("%d%d", &n,&k) != EOF) { for(int i = 1; i <= n; i++) { scanf("%d", &a[i] ); c[i] = a[i]; } int D = init(); // printf("D = %d\n", D); D = D - k%D; for(int i = 1; i <= D; i++) { for(int i = 1; i <= n; i++) b[i] = a[ a[i] ]; for(int i = 1; i <= n; i++) a[i] = b[i]; } for(int i = 1; i <= n; i++) printf("%d\n", a[i] ); } return 0; }