• UVA 10334 Ray Through Glasses


    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]);
    }
    }
    }


  • 相关阅读:
    洛谷 P1525 关押罪犯(并查集|二分图判定&二分答案)
    洛谷 P1948 [USACO08JAN]Telephone Lines S(贪心+最短路)
    洛谷 P1315 观光公交(贪心+模拟)
    洛谷 P3258 [JLOI2014]松鼠的新家(树上差分)
    【NOIP2001】统计单词个数
    【洛谷习题】皇后游戏
    【洛谷习题】木棍加工
    【SDOI2008】仪仗队
    【洛谷习题】末日的传说
    【洛谷习题】又是毕业季I
  • 原文地址:https://www.cnblogs.com/staginner/p/2288871.html
Copyright © 2020-2023  润新知