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


  • 相关阅读:
    小程序数据库 用正则查询字符串字段/数组字段
    一键禁用Windows多余?服务
    Switch 10.1.0 无法启动软件请在home菜单中再试一次 解决方法
    算法记录
    LeetCode——面试题 10.01. 合并排序的数组
    LeetCode——98. 验证二叉搜索树
    LeetCode——55. 跳跃游戏
    LeetCode——92. 反转链表 II
    LeetCode——206. 反转链表
    LeetCode——225. 用队列实现栈
  • 原文地址:https://www.cnblogs.com/staginner/p/2288871.html
Copyright © 2011-2022 走看看