题意:n个人围成一圈,1,2报数,每次报到1的人出队,直到没人为止.
Q次询问,每次询问编号x的是第几个出队的? n,x<=1e18, Q<=5e5.
每个人编号++,n变为1.那么第一轮淘汰掉所有偶数编号的人.
Q次询问,每次询问编号x的是第几个出队的? n,x<=1e18, Q<=5e5.
每个人编号++,n变为1.那么第一轮淘汰掉所有偶数编号的人.
此时剩下的每个人重新编号.求出此时x的编号,每轮淘汰偶数编号的人,递归求解.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,Q,x;
ll solve(ll n,ll x)
{
if(n==1)
return 1;
if(x%2)
{
ll id=(x+1)/2;
if(n%2)
{
if(x==n)
id=1;
else
id=(x+1)/2+1;
}
return n/2+solve(n-n/2,id);
}
return x/2;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>Q;
while(Q--)
{
cin>>x;
x++;
if(x>n)
x=1;
cout<<solve(n,x)<<'\n';
}
return 0;
}