http://codeforces.com/contest/950/problem/D
前n/2个格子的奇数下标的数没有参与移动
候n/2个格子的奇数下标的数一定是一路移向偶数下标移
所以还原数的初始位置时,让数沿原来的路线向右移动,到达的第一个奇数下标就是这个数的初始位置
在初始位置a的数是(a+1)/2
现在就剩下了如何还原数向左移的过程
假设数a最后移到了位置x,
在位置x之前有 x/2 个奇数位有数
a移到了x,说明除了前面的数,剩下的数都在x之后
所以位置x之后有n-x/2-1 个数,这n-x/2-1个数一定是相邻的
所以a在最后一次移动前的位置为 x+n-x/2
如果这个位置是奇数位,结束
如果还是偶数位,同样的分析方式,继续变成x+n-x/2
#include<iostream> using namespace std; int main() { long long n,q,x; cin>>n>>q; while(q--) { cin>>x; while(!(x&1)) x+=n-x/2; cout<<(x+1>>1)<<'\n'; } }