题目链接:https://cn.vjudge.net/problem/NBUT-1225
【题意】
给一个1—n的序列,经过m次操作,输出前m个数字。
具体操作是把序列的偶数项按顺序提到奇数位的前面。
【思路】
找到循环节,用一的位置找循环节,因为1一旦循环之后还是1,
那么中间循环的次数就是循环节,如果当前位置是偶数位X,那么
交换一次是X’=X/2,如果在奇数位X,那么交换一次是X’=n/2+X/2。
【代码】
int n,m,k;
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
if(n%2==0)
n++;
int x=1,step=0;
while(1)
{
if(x%2==1) x=(n+x)/2;
else x=x/2;
step++;
if(x==1) break;
}
m%=step;
for(int i=1;i<=k;i++)
{
int p=i;
for(int j=0;j<m;j++)
{
if(p*2<=n)
p*=2;
else
p=p*2-n;
}
printf("%d",p);
if(i!=k)
printf(" ");
}
printf("\n");
}
}