zoukankan      html  css  js  c++  java
  • 【hiho一下】41 斐波那契数列【矩阵快速幂】

    计算 斐波那契数列 第n项 MOD 19999997的结果

    #include <iostream>
    using namespace std;
    
    /*2x2矩阵相乘与2x1矩阵相乘*/
    void mul(long long F[2][2], long long M[2][2]) {
    	long long lt, rt,
    		bl, br;
    	lt = F[0][0] * M[0][0] + F[0][1] * M[1][0], rt = F[0][0] * M[0][1] + F[0][1] * M[1][1];
    	bl = F[1][0] * M[0][0] + F[1][1] * M[1][0], br = F[1][0] * M[0][1] + F[1][1] * M[1][1];
    	lt = lt % 19999997;
    	rt = rt % 19999997;
    	bl = bl % 19999997;
    	br = br % 19999997;
    	F[0][0] = lt, F[0][1] = rt;
    	F[1][0] = bl, F[1][1] = br;
    }
    /*2x2矩阵求乘方*/
    void power2(long long F[2][2], long long n) {
    	if (n == 0 || n == 1) {
    		return;
    	}
    	long long M[2][2] = { { 1, 1 },{ 1, 0 } };
    	power2(F, n / 2);
    	mul(F, F);
    	if (n % 2 != 0) {
    		mul(F, M);
    	}
    }
    /*求斐波那契数列高效算法(O(log2n))*/
    /*当n较小时比int fibonacci(int n)慢,当n较大时明显快于其他算法*/
    long long fibnacci_3(long long n) {
    	long long F[2][2] = { { 1, 1 },{ 1, 0 } };
    	if (n == 0) {
    		return 0;
    	}
    	power2(F, n - 1);
    	return F[0][0];
    }
    
    int main() {
    	long long n;
    	cin >> n;
    	cout << fibnacci_3(n + 1) << endl;
    	return 0;
    }
    
  • 相关阅读:
    COJ 1691:前缀和
    COJ 1692:模拟
    POJ 3415:后缀数组+单调栈优化
    python拓展知识
    git总结
    好的文章及博客收集
    python爬虫总结
    ajax与java后台交互
    Java多线程与并发库
    Django框架创建
  • 原文地址:https://www.cnblogs.com/shengwang/p/9748527.html
Copyright © 2011-2022 走看看