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;

}

 

你可能感兴趣的:(poj)