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;
}

 

posted @ 2012-12-31 11:15  yefeng1627  阅读(195)  评论(0编辑  收藏  举报

Launch CodeCogs Equation Editor