题目链接 codeforces 950D
题意:
给出一个n,每个数i 在2*i-1 的位置,每次把最后一个往前面的空格处移动,直到没有空格 ,q次查询,问第x位置的数是多少
题解:
当查询的位置为奇数时, 数字没有移动过,为 (x+1)/ 2
当查询的位置为偶数时,意味着当前位置的前 有 x / 2 个数字没有移动过,然后往后加,直到位置为奇数,最后为(x+1)/ 2
以 n = 6 举例, 看 6 的移动
初始情况 ① 1 _ 2 _ 3 _ 4 _ 5 _ 6
② 1 _ 2 _ 3 _ 4 _ 5 6
③ 1 _ 2 _ 3 _ 4 6 5
④ 1 _ 2 _ 3 5 4 6
⑤ 1 _ 2 6 3 5 4
⑥ 1 4 2 6 3 5
看6 的移动 ,将6 放回原来的位置
① 1 4 2 6 3 5 // 6此时在索引4的位置,前面有两个元素没有移动,分别是1 2
② 1 _ 2 _ 3 5 4 6 // 6此时应该在索引 8 的位置, 前面有 4 个元素没有移动过,分别是1 2 3 4
③ 1 _ 2 _ 3 4 5 6 // 6此时回到初始位置,索引为 13 为奇数,结束
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main(){
ll n, q;
cin >> n >> q;
for(ll i = 1; i <= q; i++){
ll k;
cin >> k;
if(k % 2 == 1){
cout << (k+1)/2 << endl; // 奇数
}
else{
while(k % 2 == 0){
k = k + (n - k/2); // 偶数,向后挪(n-k/2)个
}
cout << (k+1)/2 << endl;
}
}
return 0;
}