Problem:
Score : 400 points

Problem Statement

Caracal is fighting with a monster.

The health of the monster is H.

Caracal can attack by choosing one monster. When a monster is attacked, depending on that monster's health, the following happens:

If the monster's health is 1, it drops to 0.

If the monster's health, X, is greater than 1, that monster disappears. Then, two new monsters appear, each with the health of \lfloor X/2 \rfloor.

(\lfloor r \rfloor denotes the greatest integer not exceeding r.)

Caracal wins when the healths of all existing monsters become 0 or below.

Find the minimum number of attacks Caracal needs to make before winning.

Constraints

1 \leq H \leq 10^{12}

All values in input are integers.

Input

Input is given from Standard Input in the following format:

H

Output

Find the minimum number of attacks Caracal needs to make before winning.

Sample Input 1

2

Sample Output 1

3

When Caracal attacks the initial monster, it disappears, and two monsters appear, each with the health of 1.

Then, Caracal can attack each of these new monsters once and win with a total of three attacks.

Sample Input 2

4

Sample Output 2

7

Sample Input 3

1000000000000

Sample Output 3

1099511627775

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AtCoders {
	class Program {
		static void Main(string[] args) {
			var inputArray = retreiveLongArray();
			var inputCount = 1;

			// 不正な入力は処理しない
			if (inputArray.Length != inputCount) {
				Console.WriteLine("invalid input");
				return;
			}

			var H = inputArray[0];




			//答えの出力
			var ans = getAns(H);
			Console.WriteLine(ans);

		}

		/// <summary>
		// 必要な攻撃の最小回数は、2^x <= H < 2^(x+1)　となる 2^xがHの時と同じ回数になる
		// 2^(x+1)のHを0にするのに必要な回数は、2^(x)のHを0にするのに必要な回数をkとすると、2k+1になる
		// f(x) = sum(2^(i))... i=0~x-1 であることが帰納法で示せる
		/// </summary>
		/// <param name="H"></param>
		/// <returns></returns>
		private static long getAns(long H) {

			if (H == 1) {
				return 1;
			}


			//まずxを求める
			var x = 0;
			while (Math.Pow(2, x+1 ) <= H) {
				x++;
			}
			//Console.WriteLine($"x={x}");

			long ans = 1;
			long exp2 = 1;
			for (int i = 0; i < x; i++) {
				exp2 *= 2;
				ans += exp2;
			}
			return ans;

		}

		/// <summary>
		/// スペースで区切られた文字列配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static string[] retreiveStringArray() {
			var inputArray =  Console.ReadLine().Split(' ');
			return inputArray;
		}

		/// <summary>
		/// スペースで区切られた整数配列の入力を受け取る
		/// </summary>
		/// <returns></returns>
		private static long[] retreiveLongArray() {
			var inputArray = Console.ReadLine().Split(' ');
			var longArray = inputArray.Select(s => long.Parse(s));
			return longArray.ToArray();
		}
	}
}