【问题标题】:find nth fibonacci number where n can vary till 10^9找到第 n 个斐波那契数,其中 n 可以变化到 10^9
【发布时间】:2019-09-22 20:30:39
【问题描述】:

// 我试图找到 (n^n)%1000000007,其中 n 是该系列的第 n 个斐波那契项。 示例:n=3 和 4 (2^2)

 public class Sol_Big {
 public static void main(String args[])
{  
       int n =10000000;
       BigInteger a = BigInteger.ZERO;
       BigInteger b = BigInteger.ONE;
       BigInteger c = BigInteger.valueOf(1);
       BigInteger MOD = BigInteger.valueOf(1000000007);

       for (int j=2 ; j<=n ; j++)
       {
           c =  a.add(b);
           c=c.mod( MOD);
           a = b.mod(MOD);
           b = c.mod(MOD);
       }
        System.out.println(c);
        BigInteger result = BigInteger.valueOf(1);
        result = c.modPow(c, MOD);
        int intval = result.intValue();
        System.out.println( intval);

      }
}

// 我的代码适用于 10^7 输入,但对于 10^8 及以后的输入,它已超出时间限制....

【问题讨论】:

  • 为此目的使用 stringbuffer 是个好主意。在 sr=tring 缓冲区中进行操作并返回最终字符串。

标签: java fibonacci biginteger


【解决方案1】:

诀窍是注意您可以使用矩阵乘法计算斐波那契数:

| 0 1 |   | a |   | b     |
| 1 1 | * | b | = | a + b |

有了这些知识,我们可以计算出第n个斐波那契数:

| 0 1 |^n   | 0 |
| 1 1 |   * | 1 |

由于矩阵乘法是关联的,我们可以高效地计算m^n。

  • 如果n 是偶数,m^n = m^(n/2) * m^(n/2)
  • 如果n 是奇数,m^n = m^((n-1)/2)) * m^((n-1)/2)) * m

请注意,我们需要两次相同的东西,但我们只需要计算一次。
这使得计算O(log n) 中的第n 个斐波那契数成为可能。

我留给你写代码。

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 2021-09-03
    • 2022-12-10
    • 2014-02-22
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多