您的位置:首页 > 其它

poj 1721 CARDS 置换群

2012-12-31 11:15 387 查看
没看到题目上说 仅一个循环因子.. 现在我还是没看到.....

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: