zoukankan      html  css  js  c++  java
  • POJ 3070 Fibonacci(矩阵高速功率)

    职务地址:POJ 3070

    用这个题学会了用矩阵高速幂来高速求斐波那契数。


    依据上个公式可知,第1行第2列和第2行第1列的数都是第n个斐波那契数。所以构造矩阵。求高速幂就可以。

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <stdlib.h>
    #include <math.h>
    #include <ctype.h>
    #include <queue>
    #include <map>
    #include <set>
    #include <algorithm>
    
    using namespace std;
    const int mod=1e4;
    struct matrix
    {
        int ma[3][3];
    }init, res;
    matrix Mult(matrix x, matrix y)
    {
        matrix tmp;
        int i, j, k;
        for(i=0;i<2;i++)
        {
            for(j=0;j<2;j++)
            {
                tmp.ma[i][j]=0;
                for(k=0;k<2;k++)
                {
                    tmp.ma[i][j]=(tmp.ma[i][j]+x.ma[i][k]*y.ma[k][j])%mod;
                }
            }
        }
        return tmp;
    }
    matrix Pow(matrix x, int k)
    {
        int i, j;
        matrix tmp;
        for(i=0;i<2;i++)
        {
            for(j=0;j<2;j++)
            {
                tmp.ma[i][j]=(i==j);
            }
        }
        while(k)
        {
            if(k&1) tmp=Mult(tmp,x);
            x=Mult(x,x);
            k>>=1;
        }
        return tmp;
    }
    int main()
    {
        int k;
        while(scanf("%d",&k)!=EOF&&k>=0)
        {
            init.ma[0][0]=1;
            init.ma[0][1]=1;
            init.ma[1][0]=1;
            init.ma[1][1]=0;
            res=Pow(init,k);
            printf("%d
    ",res.ma[0][1]);
        }
        return 0;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Java 面试 --- 3
    Java 面试-- 1
    面试之痛 -- 二叉树 前序 中序 后序
    java 事务
    深入理解mybatis
    hibernate
    mybatis 原理
    spring 原理
    spring aop
    spring 事务
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4721547.html
Copyright © 2011-2022 走看看