游客 Signup | Login
中文 | En

3497 - 激动的比赛

 出题组想到大家比赛时,心里肯定非常紧张,于是想请大家玩一个游戏,把大家围成一个环,假设有n个人,那么就围成一个n个人的环,对n位选手顺时针从1开始依次编号,从第一个人开始,顺时针每经过一位选手就踢掉一位选手,当踢到只剩一位选手时,那么我们就认为该选手成功解答了一题,这里我们偷偷告诉大家一个秘密,如果你能提前算出最后一位不被踢掉的选手的位置,你就可以AC哦!

 

 

 

<span style="font-size:16px;">对于第一个样例:</span> 

<span style="font-size:16px;">被踢除的先后顺序为:2,4,1,5,3</span> 

<span style="font-size:16px;">故在3号位置上的选手可以成功AC</span> 

Input

测试包含多组测试数据

<span style="font-size:16px;font-family:宋体;">一行为一个整数</span><span style="font-size:16px;">n</span><span style="font-size:16px;font-family:宋体;">,表示参赛总人数</span><span></span> 

<span style="font-size:16px;">1&lt;=n&lt;=10^18</span> 

Output

 每组测试数据输出一行

一个整数,哪个位置上的人能幸运的AC

Examples

Input

5

Output

3

Hint

作者:李雪峰

Solution C

#include <stdio.h>
#include <string.h>
#include <math.h>
typedef long long LL;
LL x,y;
LL s;
int main(){
	while(~scanf("%lld",&x)){
		s=(LL)(log(x+1)/log(2.0));
		x=x-pow(2,s)+1;
		if(x==0)
			printf("%lld\n",(LL)(pow(2,s)-1));
		else
			printf("%lld\n",2*x-1);
	}
	return 0;
} 

Solution C++

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ll n;
    while(~scanf("%lld",&n)){
        ll len=0;
        ll ans=0;
        ll data=1;
        for (ll i=0;i<63;i++){
            if ((data<<i)>n){
                len=i-1;
                break;
            }
        }
        ans=(n-(data<<len));
        printf("%lld\n",(ans<<data)+data);
    }
    return 0;
}

Hint

作者:李雪峰

Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题