题目链接:https://ac.nowcoder.com/acm/contest/940/C/
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

kotori和一些偶像们围成一圈,一共有n个偶像(包括kotori自己),她们的序号顺时针从1到n。现在她们从1号开始进行顺时针报数:1,2,1,2,1……
每个报到2的人出列。直到剩下最后一个人为止。那么这个剩下的人就能被选中发专辑出道啦!
kotori可以暗箱操作决定自己的序号。她很想发专辑,于是向聪明的你求助,初始序号设定为多少才可以呢?

输入描述

第一行输入一个正整数t,代表共有t组样例。
第2行到第t+1行,每行一个正整数n,代表一次询问。
(1≤t≤10000,1≤n≤10^18)

输出描述

一共t行,每行一个正整数,代表kotori的初始序号。

输入

1
5

输出

3

说明

依次出列的序号是2,4,1,5,故3号胜出,可以发专辑。

解题思路

题意:约瑟夫环问题。
思路:数据过大不能用递归解决,打表找规律得2*(n-cnt)+1, 其中cnt为不大于n的最大2的整数幂。

Accepted Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    int t;
    ll n;
    scanf("%d", &t);
    while (t--) {
        ll cnt = 1;
        scanf("%lld", &n);
        while (cnt << 1 <= n)
            cnt <<= 1;
        printf("%lld\n", ((n - cnt) << 1) + 1);
    }
    return 0;
}