poj 1721 CARDS 置换群
2012-12-31 11:15
387 查看
没看到题目上说 仅一个循环因子.. 现在我还是没看到.....
WA了好久, 一直用 置换群分解循环因子后,对每一个循环因子 其 阶数即为循环节. 之后无限WA..
找了好久.才发现. 这里的置换, 每一次 double shuffer 后. 其循环因子顺序已经改变了. 我们使用循环因子的顺序是相对于最初的情况而言.
所以这里不能够用循环因子来做.
模拟其置换过程,找出其 置换循环 D, 对于置换X经过S次置换后得到Y, 则 Y再经过 D-S%D 次置换后又回到 X.
View Code
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 , b ,c , vis ; 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; }
相关文章推荐
- POJ 1721 CARDS (置换群)
- POJ 1721 CARDS <置换群>
- POJ 1721 CARDS(置换群)
- poj 1721 CARDS (置换群)
- poj 1721 CARDS(置换群的幂运算)
- poj 1721 CARDS(置换群)
- POJ 1721 - CARDS【置换群】
- poj 1721 CARDS 【置换群 】【求最小循环节 再由末序列 求 初序列】
- 【POJ 1721】CARDS(置换群)
- POJ-1721 CARDS 置换群分数幂运算
- 【POJ】1721 - CARDS(置换群)
- poj 1721 CARDS (置换群)
- POJ 1721-CARDS(置换群-单个循环置换幂运算 倒推)
- poj 1721 CARDS 洗牌机
- pku1721 CARDS(置换群的幂运算) ???
- poj1721 CARDS
- POJ 1721 CARDS
- POJ 1721 CARDS 置换群
- [置换开方] POJ 1721 CARDS
- poj 1721 CARDS(置换)