/* 算法剖析: 观察规律,下一个序列为前一个序列的复制,取反后链接起来,即 1 01 10 01 0110 1001 10010110 01101001 所以当前序列连续0的对数等于前一个序列0的对数加1的对数,如果为奇数时,还要加上连接处形成的1对. 故可写出递推方程: f[n][0] = f[n-1][0] + f[n-1][1]; 由于成指数级增长,所以采用JAVA大数类,非常方便! http://www.tkz.org.ru/2009-05/%E3%80%90%E9%A2%98%E8%A7%A3%E7%BB%8F%E9%AA%8C%E3%80%91hdoj1041-java%E5%A4%A7%E6%95%B0%E7%B1%BB%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E9%87%8D%E5%AE%9A%E5%90%91/ */ import java.util.*; import java.io.*; import java.math.*; public class Main1041 { static BigInteger f[][] = new BigInteger[1002][2]; static BigInteger g[] = new BigInteger[1005]; public static void main(String[] args) { Scanner cin = new Scanner(System.in); Sovle(); F(); while (cin.hasNext()) { //System.out.println(f[cin.nextInt() + 1][0]); System.out.println(g[cin.nextInt()]); } } static void Sovle() { f[1][0] = BigInteger.ZERO; f[1][1] = BigInteger.ZERO; for (int i = 2; i <= 1001; i++) { f[i][0] = f[i - 1][0].add(f[i - 1][1]); f[i][1] = f[i - 1][0].add(f[i - 1][1]); if (i % 2 == 1) f[i][0] = f[i][0].add(BigInteger.ONE); } } static void F(){ g[1] = BigInteger.ZERO; g[2] = BigInteger.ONE; for(int i = 3; i <= 1000; i++) g[i] = g[i - 2].add(BigInteger.valueOf(2).pow(i - 3)); } }