zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    vb移动窗体的代码
    vb得到一个进程的启动参数?
    UTF8方式读写文件的模块
    JavaScript中Window.event详解
    vb设置窗体不可移动
    一拖二
    实习第一天
    사랑해
    决定考研
    Eclipse快捷键
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/2840379.html
Copyright © 2011-2022 走看看