码迷,mamicode.com
首页 > 其他好文 > 详细

[Ceoi98]Cards洗牌机

时间:2018-03-07 21:43:17      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:iostream   而且   blog   wol   一个   signed   str   for   body   

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

[Ceoi98]Cards洗牌机

标签:iostream   而且   blog   wol   一个   signed   str   for   body   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!