zoukankan      html  css  js  c++  java
  • 【fjwc2015】世界树

    【题目描述】

    奥丁杀死的巨人伊米尔后,从伊米尔的尸体上生长出来一株巨大的梣树,它是整个宇宙的核心,被称为世界之树,这个巨木的枝干构成了整个世界,它被神秘的奥术力量所守护。

    奥丁发现,世界树的每个节点至多有两棵子树,其蕴含的奥术力量是子树奥术力量的最大值+1,如果一个节点没有子树,其奥术力量为1,这些节点被称为“源”。

    世界树在悠长的岁月里形成了奇妙的魔法平衡,具体来说,它的左子树与右子树的奥术力量的差的绝对值不会超过1。若一个节点只有一棵子树(不妨设为左子树),则右子树的奥术力量视为0。

    现在奥丁想知道,在n个节点的世界树中,最高和最低的两个“源”的深度差最大是多少?

    【输入格式】

    第一行一个整数T,表示数据组数。

    以下T行,每行一个整数n表示世界树的节点数。

    【输出格式】

    T行,每行一个整数表示任意两个“源”的奥术力量的差的最大值。

    【样例输入】

    2

    5

    12345

    【样例输出】

    1

    9

    【数据范围】

    对于10%的数据,n <= 10

    对于40%的数据,n <= 2^31 – 1

    对于60%的数据,n <= 10^100

    对于80%的数据,n <= 10^1000

    对于100%的数据,1 <= n <= 10^10000, T <= 50

    前八个点时间限制2000ms,最后两个数据点时间限制6000ms

    构造题

    来来来我们来找规律

    数学归纳法

    height为k的树可以由height为k-1和height为k-2的树构出    递推式包含斐波拉契数列。高度为h的世界树,至少包含S(h) = fib(h+3) – 1个节点。

    然后

    左为height,右为最小和最大高度

    1  1 1

    2  2 2

    3  2 3

    4  3 4

    5  3 5

    6  4 6

    7  4 7

    8  5 8

    聪明的你一定已经发现ans=(height-1)/2

     

    矩阵乘法快速幂

    判断n处在哪两个Fibonacci数之间,更准确地说是找到最大的h,满足fib(h+3) – 1 <= n,本题答案即为[h/2]

  • 相关阅读:
    ubuntu上如何安装和卸载google chrome 浏览器
    另眼相看“那些争议最大的编程观点”
    读完了csapp(中文名:深入理解计算机系统)
    SSL工作原理
    linux signal 处理
    PCB设计资料:看到最后才知道是福利
    String.Format使用方法
    matlab三维画图
    spin_lock &amp; mutex_lock的差别?
    Hibernate Criterion
  • 原文地址:https://www.cnblogs.com/awipppp/p/5971350.html
Copyright © 2011-2022 走看看