HDU 1041 Computer Transformation(递推)

Computer Transformation

/*
首先枚举前几项的话

0:1
1:01
2:10 01
3:01101001
4:10010110 01101001
5:01101001100101101001011001101001

……

发现两个个规律,

1:

所有项前一半和后一半互反,此外,偶数项对称。
想来也是,只要满足某个前一项前一半和后一半互反,0->10,1->01后,自然造成后一项同样互反的形式。
同样的前一个偶数项的对称会导致后面奇数项的前一半和后一半都对称,自然导致后一个偶数项对称。
此处严谨证明应由数学归纳法。

2:

后一项等于前一项取反拼上前一项。
发现奇数项由于前后互反,在交接处会形成01,那么下一项在对称情况下,交界处必形成1001。所以偶数项的0对会多生成一个。
有了这些就知道了两项间的关系。

于是由2得:

zero[i] = zero[i-1]+one[i-1]+(i-1)%2;
one[i] = zero[i-1]+one[i-1];

由于递推式看起来增长速度就和费波拉契有的一比,估计需要大数。实测确实需要。
*/
import java.math.BigInteger;
import java.util.Scanner;


public class Main
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        BigInteger one[] = new BigInteger[1005];
        BigInteger zero[] = new BigInteger[1005];
        one[1] = new BigInteger("0");
        one[2] = new BigInteger("0");
        zero[1] = new BigInteger("0");
        zero[2] = new BigInteger("1");
        for (int i = 3; i <= 1000; ++i)
        {
            zero[i] = zero[i-1].add(one[i-1]).add(new BigInteger(Integer.toString((i-1)%2)));
            one[i] = zero[i-1].add(one[i-1]);
        }
        int n;
        while (input.hasNext())
        {
            n = input.nextInt();
            System.out.println(zero[n]);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/ccshijtgc/article/details/80887327