【矩阵快速幂】POJ 3070 Fibonacci (大数 Fibonacci)(大二版)

来源:互联网 发布:centos搭建mc服务器 编辑:程序博客网 时间:2024/06/05 00:25

【题目链接】:click here~~

【题目大意】:

In the Fibonacci integer sequence, F0 = 0, F1 = 1, andFn =Fn − 1 +Fn − 2 forn ≥ 2. For example, the first ten terms of the Fibonacci sequence are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

An alternative formula for the Fibonacci sequence is

.

Given an integer n, your goal is to compute the last 4 digits of Fn.

【解题思路】

练习矩阵快速幂的基础题了,不说了,比较基础,初学快速幂的可以看这里 click here~~   click here~~加深理解

本题注意取模mod的大小

代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <math.h>using namespace std;const int mod[5]= {0,10,100,1000,10000};const int MOD =10000;#define LL long longLL X,Y,N,M,i,j;struct Matrlc{    int  mapp[2][2];} ans,base;Matrlc unit= {1,0,0,1};Matrlc mult(Matrlc a,Matrlc b){    Matrlc c;    for(int i=0; i<2; i++)        for(int j=0; j<2; j++)        {            c.mapp[i][j]=0;            for(int k=0; k<2; k++)                c.mapp[i][j]+=(a.mapp[i][k]*b.mapp[k][j])%MOD;//mod[M];            c.mapp[i][j]%=MOD;        }    return c;}int pow(int  n){    base.mapp[0][0] =base.mapp[0][1]=base.mapp[1][0]=1;    base.mapp[1][1]=0;    ans.mapp[0][0] = ans.mapp[1][1] = 1;// ans 初始化为单位矩阵    ans.mapp[0][1] = ans.mapp[1][0] = 0;    while(n)    {        if(n&1)   ans=mult(ans,base);        base=mult(base,base);        n>>=1;    }    return ans.mapp[0][1];}int main(){    int t;    while(cin>>N&&N!=-1)    {        printf("%d\n",pow(N));    }    return 0;}



0 0