lintcode949.Fibonacci II (利用矩阵快速幂)
题目:
In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 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
答案
class Solution {
public:
/**
* @param n: an integer
* @return: return a string
*/
typedef long long ll;
const int MOD=10000;
struct mat
{
ll a[2][2];
};
mat mat_mul(mat x,mat y) //矩阵相乘
{
mat res;
memset(res.a,0,sizeof(res.a));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j])%MOD;
return res;
}
long long mat_pow(int n) //矩阵快速幂
{
mat c,res;
c.a[0][0]=c.a[0][1]=c.a[1][0]=1;
c.a[1][1]=0;
memset(res.a,0,sizeof(res.a));
for(int i=0;i<2;i++) res.a[i][i]=1;
while(n) //核心代码
{
if(n&1) res=mat_mul(res,c);
c=mat_mul(c,c);
n=n>>1;
}
return res.a[0][1];
}
string lastFourDigitsOfFn(int n) {
// write your code here
if(n == 0) return "0";
long long r = mat_pow(n);
string str = "";
for(int i = 3;i >= 0;i--){
str +=(char) ((r)+'0');
r/=10;
}
reverse(str.begin(),str.end());
return str;
}
};