zoukankan      html  css  js  c++  java
  • 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]);
    }
    }
    }


  • 相关阅读:
    encog(二)神经网络的训练
    encog(一)
    JAVA基础知识总结14(String、StringBuffer、StringBuilder)
    JAVA基础知识总结13(同步)
    JAVA基础知识总结12(多线程)
    JAVA基础知识总结11(异常)
    JAVA基础知识总结10(包类)
    JAVA基础知识总结9(特殊类)
    JAVA基础知识总结8(设计模式)
    JAVA基础知识总结7(抽象类 | 接口)
  • 原文地址:https://www.cnblogs.com/staginner/p/2288871.html
Copyright © 2011-2022 走看看