题目:
设2n张牌分别标记为1, 2, ..., n, n+1, ..., 2n,初始时这2n张牌按其标号从小到大排列。经一次洗牌后,原来的排列顺序变成n+1, 1, n+2, 2, ..., 2n, n。即前n张牌被放到偶数位置2, 4, ..., 2n,而后n张牌被放到奇数位置1, 3, ..., 2n-1。可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态。现在你的的任务是计算对于给定的n的值(n≤10^5),最少需要经过多少次洗牌可恢复到初始状态。
10Sample Output
6
思路:
看1的下标的变化。
1 2 3 4 5 6 7 8 9 10
6 1 7 2 8 3 9 4 10 5 2
3 6 9 1 4 7 10 2 5 8 4
7 3 10 6 2 9 5 1 8 4 8
9 7 5 3 1 10 8 6 4 2 5
1 0 9 8 7 6 5 4 3 2 1 10
5 10 4 9 3 8 2 7 1 6 9
8 5 2 10 7 4 1 9 6 3 7
4 8 1 5 9 2 6 10 3 7 3
2 4 6 8 10 1 3 5 7 9 6
1 2 3 4 5 6 7 8 9 10 1
代码:
#include<stdio.h>
/*
1、当下标小于等于n时候,下标是它的2n倍。
2、当下标大于n时候,下标是(下标%n)*2-1
3、当下标等于2*n时候,下标为 -1.
*/
int main(){
int n;
while(~scanf("%d",&n)){
int m =1,count = 0;
while(m!=1||count == 0){
if(m == 2*n){
m = m-1;
}else if(m>n){
m = (m%n)*2-1;
}else{
m = 2*m;
}
count++;
}
printf("%d\n",count);
}
return 0;
}