UVA_10334

    这个题目多列几项就可以猜出来是fibonacci数列。

    如果要证明的话,我们不妨来看下折射次数为n的光线是怎么构成的,实际上它们都是在折射次数为n-1的最终的射出光线与3条横线的交点位置反向画一条射出光线形成的。

    因此,我们可以得知折射次数为n-1的所有光路中的最终的射出光线与横线的交点的数量就是折射次数为n的光路的总数。

    按交点的性质可以分成两类,我们不妨以x表示射出光线与中间那条横线形成的交点数,以y表示射出光线与两边横线形成的交点数。我们不难发现,对于在每一个x类交点处画反向射出光线时可以形成一个y类交点,对于在每一个y类交点处画反向射出光线时可以同时形成一个x类的交点和一个y类的交点。那么对于折射次数为n时,我们不难写出x类交点和y类交点数量的递推公式,x(n)=y(n-1),y(n)=x(n-1)+y(n-1),我们把两式相加,可以得到x(n)+y(n)=x(n-1)+y(n-1)+y(n-1)=x(n-1)+y(n-1)+x(n-2)+y(n-2),令f(n)=x(n)+y(n),就可以得到f(n)=f(n-1)+f(n-2)。

    前面也已经解释了射出光线与横线交点的数量和光路数之间的关系,既然射出光线与横线交点的数量是斐波那契数,那么光路数也自然是斐波那契数。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
BigInteger[] f = new BigInteger[1010];
f[0] = new BigInteger("1");
f[1] = new BigInteger("2");
for(int i = 2; i <= 1000; i ++)
f[i] = f[i - 1].add(f[i - 2]);
while(cin.hasNext())
{
int N = cin.nextInt();
System.out.println(f[N]);
}
}
}


posted on 2011-12-15 14:34  Staginner  阅读(369)  评论(0编辑  收藏  举报