Description
有一个长度为2n的序列,编号为1,2,,…,n,n+1,…,2n-1,2n.经过一次变换后这个序列会变成n+1,1,n+2,2,n+3,3,n+4,4,…,2n,n.如果告诉你n,你能求出这个序列最少经过几次变换后才能变成原来的序列,若这个序列不是循环序列,既不能变成原来的序列那么输出-1.
Input
多组测试数据.每组数据的第一行包含一个正整数n(1<= n<=10000).
Output
对于每组测试数据输出最少需要经过几次变换或者-1.
Sample Input
20
1
解析
首先先理解题意,举个例子,当n=2时,序列是 1 2 3 4,第一次变换后序列变为 3 1 4 2,第二次变换后序列变为 4 3 2 1,第三次变换后序列变为 2 4 1 3,第四次变换后序列变为 1 2 3 4。
我们发现每次变换,其实就是序列前一半位置的数依次插入后一半位置数的后面,像第一次变换,1插到3后面,2插到4后面。鉴于这个规律,我们可以按1的位置变换找出1位置变换的规律,设p为1当前位置,p=2*p%(2*n+1);
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,p,c;
while(~scanf("%d",&n))
{
p=2%(2*n+1);
c=1;
while(p!=1)
{
p=p*2%(2*n+1);
c++;
}
printf("%d\n",c);
}
return 0;
}