设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),最少需要经过多少次洗牌可恢复到初始状态。
10
6
题解:手动列一个数就能找找到规律;下面我以5为例:
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
根据这个数据,可以找到这个规律:当下标小于等于5是下一步下标为它的2倍,当下标大于5时下一步下标为(这个下标%5)*2-1;当下标为10时 下一步为 10-1;
根据这个规律,可以写出如下代码:
#include<stdio.h>
int main()
{
int n;
while(~scanf("%d",&n))
{
int x=2,sum=1;
while(x!=1)
{
if(x==2*n)
x=x-1;
else
{
if(x>n)
x=(x%n)*2-1;
else
x=x*2;
}
sum++;
}
printf("%d\n",sum);
}
return 0;
}