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;
    }
  • 相关阅读:
    Docker 命令收集
    Linux环境变量总结
    Docker 安装Hadoop HDFS命令行操作
    Docker 搭建Spark 依赖singularities/spark:2.2镜像
    Docker 搭建Spark 依赖sequenceiq/spark:1.6镜像
    kill命令
    每天一个linux命令:ps命令
    swoole执行外部程序称为进程
    php休眠微秒
    php监控文件变化
  • 原文地址:https://www.cnblogs.com/yefeng1627/p/2840379.html
Copyright © 2011-2022 走看看