function Main(input: string): void { // 最終的に実現するビスケットの数 const target = parseInt(input); // 最終的に実現するビスケットの数に対して、法則性を確認する // <1>targetが 2の2乗 より大きく 2の3乗 以下の場合は、3回叩くことで実現できるのか // <2>targetが 2の3乗 より大きく 2の4乗 以下の場合は、4回叩くことで実現できるのか // この<1><2>が成立するのであれば、それ以外のtargetの取る値の範囲においても同様だと言えるはず。 // <1> 2^2(4) < target <= 2^3(8) なら、3回で全て実現できるのか : 実現できる // - 5枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-1)+1*2 = 5 // - 6枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-2)+2*2 = 6 // - 7枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-3)+3*2 = 7 // - 8枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 = 8 // <上の数式について説明> // 例えば5枚にしたい場合、下記のような手順を踏むことになる。上の数式(っぽいもの)ではこれを表現している。 // - 最初の1枚を叩いて2倍に : 計1枚 * 2倍 = 計2枚 // - 計2枚すべてを叩いて2倍に : 計2枚 * 2倍 = 計4枚 // - 計4枚のうち、1枚だけを叩いて2倍に : (計4枚 - 1枚抜く) + 抜いた1枚 * 2倍 = 計5枚 // <2> 2^3(8) < target <= 16(2^4)なら、4回で全て実現できるのか : 実現できる // - 9枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-1)+1*2= 9 // - 10枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-2)+2*2= 10 // - 11枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-3)+3*2= 11 // - 12枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-4)+4*2= 12 // - 13枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-5)+5*2= 13 // - 14枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-6)+6*2= 14 // - 15枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-7)+7*2= 15 // - 16枚にする場合 : 1*2 -> (2-2)+ 2*2 -> (4-4)+4*2 -> (8-8)+8*2= 16 // つまり求めるものは、targetが2の何乗以下なのか // 問題の要件よりtargetは 10**8 以下なので、2のべき乗で言うと 2**27 以下まで精査すれば良い for (let count = 0; count <= 27; count++) { if (target <= 2 ** count) { console.log(count); break; } } } Main(require("fs").readFileSync("/dev/stdin", "utf8"));