本文主要是介绍【矩阵快速幂】POJ 3070 Fibonacci (大数 Fibonacci)(大二版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【题目链接】: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 long
LL 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;
}
这篇关于【矩阵快速幂】POJ 3070 Fibonacci (大数 Fibonacci)(大二版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!