时间限制:1秒 内存限制:128M
题目描述
给您2n张牌,编号为1,2,3,4,5……n,n+1,……2n,这也是最初牌的顺序。一次洗牌是把序列变为n+1,1,n+2,2,n+3,3……2n,n。可以证明,对于任意自然数n,都可以在经过m次洗牌后重新得到初始的顺序。编程对于小于10000的自然数n(n从键盘输入)的洗牌,求出重新得到初始顺序的洗牌次数m的值,并显示洗牌过程。
输入描述
输入整数n
输出描述
显示洗牌过程,并输出洗牌次数m
样例
输入
5
输出
1 2 3 4 5 6 7 8 9 10 1:6 1 7 2 8 3 9 4 10 5 2:3 6 9 1 4 7 10 2 5 8 3:7 3 10 6 2 9 5 1 8 4 4:9 7 5 3 1 10 8 6 4 2 5:10 9 8 7 6 5 4 3 2 1 6:5 10 4 9 3 8 2 7 1 6 7:8 5 2 10 7 4 1 9 6 3 8:4 8 1 5 9 2 6 10 3 7 9:2 4 6 8 10 1 3 5 7 9 10:1 2 3 4 5 6 7 8 9 10 m=10
Ac代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,a[10001],b[10001];
cin>>n;
for(int i=1; i<=2*n; i++) {
a[i]=i;
cout<<a[i]<<" ";
}
cout<<endl;
int m=0;
while(1) {
m++;
for(int i=1; i<=n; i++) {
b[2*i]=a[i];
b[2*i-1]=a[n+i];
}
for(int i=1; i<=2*n; i++) {
a[i]=b[i];
}
cout<<m<<":";
for(int i=1; i<=2*n; i++) {
cout<<a[i]<<" ";
}
cout<<endl;
int f=0;
for(int i=1; i<=2*n; i++) {
if(a[i]!=i) {
f=1;
}
}
if(f==0) {
cout<<"m="<<m;
break;
}
}
return 0;
}