題目描述
九連環是一種源於中國的傳統智力游戲。如圖所示,九個圓環套在一把“劍”上,並且互相牽連。游戲的目標是把九個圓環從“劍”上卸下。
圓環的裝卸需要遵守兩個規則。
第一個(最右邊)環任何時候都可以裝上或卸下。
如果第k個環沒有被卸下,且第k個環右邊的所有環都被卸下,則第k+1個環(第k個環左邊相鄰的環)可以任意裝上或卸下。
與魔方的千變萬化不同,解九連環的最優策略是唯一的。為簡單起見,我們以“四連環”為例,演示這一過程。這里用1表示環在“劍”上,0表示環已經卸下。
初始狀態為1111,每部的操作如下:
1101(根據規則2,卸下第2個環)
1100(根據規則1,卸下第1個環)
0100(根據規則2,卸下第4個環)
0101(根據規則1,裝上第1個環)
0111(根據規則2,裝上第2個環)
0110(根據規則1,卸下第1個環)
0010(根據規則2,卸下第3個環)
0011(根據規則1,裝上第1個環)
0001(根據規則2,卸下第2個環)
0000(根據規則1,卸下第1個環)
由此可見,卸下“四連環”至少需要10步。隨着環數增加,需要的步數也會隨之增多。例如卸下九連環,就至少需要341步。
請你計算,有n個環的情況下,按照規則,全部卸下至少需要多少步。

第一個(最右邊)環任何時候都可以裝上或卸下。
如果第k個環沒有被卸下,且第k個環右邊的所有環都被卸下,則第k+1個環(第k個環左邊相鄰的環)可以任意裝上或卸下。
與魔方的千變萬化不同,解九連環的最優策略是唯一的。為簡單起見,我們以“四連環”為例,演示這一過程。這里用1表示環在“劍”上,0表示環已經卸下。
初始狀態為1111,每部的操作如下:
1101(根據規則2,卸下第2個環)
1100(根據規則1,卸下第1個環)
0100(根據規則2,卸下第4個環)
0101(根據規則1,裝上第1個環)
0111(根據規則2,裝上第2個環)
0110(根據規則1,卸下第1個環)
0010(根據規則2,卸下第3個環)
0011(根據規則1,裝上第1個環)
0001(根據規則2,卸下第2個環)
0000(根據規則1,卸下第1個環)
由此可見,卸下“四連環”至少需要10步。隨着環數增加,需要的步數也會隨之增多。例如卸下九連環,就至少需要341步。
請你計算,有n個環的情況下,按照規則,全部卸下至少需要多少步。
輸入
輸入第一行為一個整數m ,表示測試點數目。
接下來m行,每行一個整數n。
接下來m行,每行一個整數n。
輸出
輸出共m行,對應每個測試點的計算結果。
樣例輸入
3
3
5
9
樣例輸出
5
21
341
提示
對於10%的數據,1≤n≤10。
對於30%的數據,1≤n≤30。
對於100%的數據,1≤n≤105,1≤m≤10。
九圓環這個東西真的很神奇
對於N環,解N連環,就是先解一個N-2連環,再解最后一個環,再上N-2連環,再解N-1連環。
F(N)= 2F(N-2)+F(N-1)+1 ===== F(N) = 2F(N-1)+1 (N&1==1) F(N) = 2F(N-1) (N & 1 == 0)
另外,九連環和格雷碼有着密切關系。
如11111,將右端看作第一環,那么他的各種狀態當成格雷碼,將其轉換為對應的二進制就是該狀態對應步數,若是求一種狀態到另一種狀態,相減即可。
在將其一和二環操作合並后還有別的知識,大家可以去找找

1 import java.util.*; 2 import java.math.BigInteger; 3 4 public class Main { 5 public static void main(String args[]) { 6 Scanner cin = new Scanner(System.in); 7 int t = cin.nextInt(); 8 while (t-- != 0) { 9 int n = cin.nextInt(); 10 BigInteger ans = BigInteger.ONE; 11 for (int i = 2; i <= n; i++) { 12 ans = ans.multiply(BigInteger.valueOf(2)); 13 if (i % 2 == 1) { 14 ans = ans.add(BigInteger.ONE); 15 } 16 } 17 System.out.println(ans); 18 } 19 20 } 21 }