Problem:
Problem F: nCm

Problem

整数nが与えられた時、nCm(異なるn個のものからm個を選ぶ組み合わせの数)が偶数となるような最小のmを出力せよ。

Input

入力は以下の形式で与えられる。

n

Constraints

入力は以下の条件を満たす。

1 ≤ n ≤ 1018

Output

nCmが偶数となるような最小のmを1行に出力する。

Sample Input 1

2

Sample Output 1

1

Sample Input 2

111

Sample Output 2

16

Sample Input 3

3

Sample Output 3

4

Solution in C++ (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

ll calc(ll x,ll y){
	if(y == 0){
		return x;
	}else{
		return calc(y,x%y);
	}
}


int main(){

	ll N,POW[32];

	POW[0] = 1;
	POW[1] = 2;
	for(int i = 2; i <= 31; i++){
		POW[i] = POW[i-1]*2;
	}

	scanf("%lld",&N);

	for(int i = 0; i <= 31; i++){
		if(POW[i]-1 == N){
			printf("%lld\n",N+1);
			return 0;
		}
	}

	if(N%2 == 0){
		printf("1\n");
		return 0;
	}

	vector<ll> bunshi;

	bunshi.push_back(N);

	ll tmp,common;

	for(ll m = 2; ;m++){
		bunshi.push_back((N-(m-1)));

		tmp = m;

		for(int i = 0; i < bunshi.size(); i++){

			if(bunshi[i] >= tmp){
				common = calc(bunshi[i],tmp);
			}else{
				common = calc(tmp,bunshi[i]);
			}

			bunshi[i] /= common;
			tmp /= common;
			if(tmp == 1)break;
		}

		for(int i = 0; i < bunshi.size(); i++){
			if(bunshi[i]%2 == 0){
				printf("%lld\n",m);
				return 0;
			}
		}
	}

	printf("%lld\n",N+1);

	return 0;
}