[Ceoi98]Cards洗牌机

Description

剀剀和凡凡有N张牌(依次标号为1,2,……,N)和一台洗牌机。假设N是奇数。洗牌机的功能是进行如下的操作:对所有位置I(1≤I≤N),如果位置I上的牌是J,而且位置J上的牌是K,那么通过洗牌机后位置I上的牌将是K。

剀剀首先写下一个1~N的排列ai,在位置ai处放上数值ai+1的牌,得到的顺序x1, x2, ..., xN作为初始顺序。他把这种顺序排列的牌放入洗牌机洗牌S次,得到牌的顺序为p1, p2, ...,pN。现在,剀剀把牌的最后顺序和洗牌次数告诉凡凡,要凡凡猜出牌的最初顺序x1, x2, ..., xN。

Input

第一行为整数N和S。1≤N≤1000,1≤S≤1000。第二行为牌的最终顺序p1, p2, ..., pN。

Output

为一行,即牌的最初顺序x1, x2, ..., xN。

Sample Input

5 2

4

1

5

3

2

Sample Output

2

5

4

1

3

强行暴力,经过res个操作后会回到原顺序,最后做\(res-s\%res\)个操作即可

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for (;ch<‘0‘||ch>‘9‘;ch=getchar())    if (ch==‘-‘)    f=-1;
    for (;ch>=‘0‘&&ch<=‘9‘;ch=getchar())  x=(x<<1)+(x<<3)+ch-‘0‘;
    return x*f;
}
inline void print(int x){
    if (x>=10)     print(x/10);
    putchar(x%10+‘0‘);
}
const int N=1e3;
int x[N+10],y[N+10],tmp[N+10];
int n,s,res;
void Next(){
    memcpy(tmp,x,sizeof(x));
    for (int i=1;i<=n;i++)   x[i]=tmp[x[i]];
}
bool check(){
    for (int i=1;i<=n;i++)   if (x[i]!=y[i]) return 0;
    return 1;
}
int main(){
    n=read(),s=read();
    for (int i=1;i<=n;i++)   x[i]=y[i]=read();
    for (res=1;;res++){
        Next();
        if (check())    break;
    }
    res-=s%res;
    for (;res;res--)    Next();
    for (int i=1;i<=n;i++)   printf("%d\n",x[i]);
    return 0;
}

原文地址:https://www.cnblogs.com/Wolfycz/p/8525092.html

时间: 2024-08-25 23:22:47

[Ceoi98]Cards洗牌机的相关文章

组合数学 - 置换群的幂运算 --- poj CARDS (洗牌机)

CARDS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1448   Accepted: 773 Description Alice and Bob have a set of N cards labelled with numbers 1 ... N (so that no two cards have the same label) and a shuffle machine. We assume that N i

[CareerCup] 18.2 Shuffle Cards 洗牌

18.2 Write a method to shuffle a deck of cards. It must be a perfect shuffle—in other words, each of the 52! permutations of the deck has to be equally likely. Assume that you are given a random number generator which is perfect. 这道题让我们实现一个洗牌的算法,实际上洗

关于java洗牌发牌小程序

package play.card; public class Card { public String num; public String suit; public Card(String num,String suit) { this.num = num; this.suit = suit; } public Card() { super(); } @Override public String toString() { String str = suit+" "+ num; r

(算法)完美洗牌

题目: 编写一个方法,洗一副牌,要求做到完美洗牌,即这副牌52!中排列组合出现的概率相同. 思路: 1.递归 2.循环 代码: #include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int rnd(int lower,int higher){ return rand()%(higher-lower+1)+lower; } void shuffle_1(int *cards,

php洗牌代码和遍历文件目录代码

<?php  /**   * 简单洗牌算法   */ $card_num=54; //牌数  print_r(wash_card($card_num)); function wash_card($card_num)  {      $cards=$tmp=array();      for($i=0;$i<$card_num;$i++){          $tmp[$i]=$i;      } for($i=0;$i<$card_num;$i++){          $index=r

手机行业洗牌 大佬们就该欣喜若狂?

目前,国内手机行业形势之错综复杂,已经达到顶峰:层出不穷的新品牌.不断入局的互联网及其他企业.数千种机型构成机海.发展战略不断更迭.口水大战此起彼伏--而除了这些明面上的表象以外,其他竞争更是暗流涌动.然而,随着国内手机市场增速放缓.销量下滑,这些乱象都有望得到缓解,甚至消失无迹. 这是因为随着国内手机市场的饱和,必然会有部分手机销售低迷.而随着竞争的残酷,手机厂商只有真正通过整合产业链并不断创新,才能存活下来.但若是大品牌自以为在这场洗牌大战中可以高枕无忧,甚至肆意而为,却并不尽然.  销量.

PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌

00-自测1. 打印沙漏(20) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两行符号数差2:符号数先从大到小顺序递减到1,再从小到大顺序递增:首尾符号数相等. 给定任意N个符号,不一定能正好组成一个沙漏.要求打印出的沙漏能用掉尽可能多的符号. 输入格式: 输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔. 输出格式: 首先

洗牌算法与蓄水池抽样

今儿看到了,就在此记录一下吧. 洗牌算法 递归做法:先将1~n-1洗牌,然后取随机数k(0<k<n),并交换n与k,代码很简单: 1 int[] shuffle(int[] cards, int n){ 2 if(n == 1){ 3 return cards; 4 } 5 shuffle(cards, n-1); 6 int k = random(1, n-1); 7 swap(card[k], card[n]); 8 return card; 9 } 也可以转成非递归的: 1 void s

国产手机新一轮洗牌:谁醒了,谁还在装睡

过去的几年,中国智能手机市场季度出货量始终保持在20%以上的增长率.然而,最新的各方数据均表明,这个增速已经放缓開始接近饱和.对于手机厂商而言.要想占据.站稳市场,就要在硬件和软件方面有所突破,并不断构建自己的生态圈. 于是,我们看到在即将过去的半年里,手机厂商使出浑身解数:无边框.曲面側屏.绝无预装软件.内容生态链--国产手机纷纷着力添加品牌附加价值,提升用户体验.市场进入白热化厮杀阶段.在渠道.定价.品牌等多个环节的不断变化中,一场真正的洗牌正在逐渐拉开. 瞄准3000元档 挺进高端市场在全