[LUOGU] P1962 斐波那契数列
求斐波那契第n项。
[f(n-1) f(n)] * [0,1] = [f(n) f(n+1)]
[1,1]
由此原理,根据矩阵乘法的结合律,用快速幂算出中间那个矩阵的n次方即可。
快速幂本质和普通快速幂一模一样,只是乘法操作换成了矩阵的乘法,可以重载。
//Stay foolish,stay hungry,stay young,stay simple
#include<iostream>
#include<cstring>
using namespace std;
const int MOD=1000000007;
typedef long long ll;
ll n;
struct Mat{
ll data[3][3];
Mat(){
memset(data,0,sizeof(data));
}
};
Mat mut(Mat x,Mat y){
Mat ret;
for(int i=1;i<=2;i++){
for(int j=1;j<=2;j++){
for(int k=1;k<=2;k++){
ret.data[i][j]=(ret.data[i][j]+(x.data[i][k]*y.data[k][j])%MOD)%MOD;
}
}
}
return ret;
}
Mat Mpow(Mat x,ll t){
Mat ret;
ret.data[1][1]=ret.data[2][2]=1;
while(t){
if(t&1) ret=mut(x,ret);
x=mut(x,x);
t>>=1;
}
return ret;
}
int main(){
cin>>n;
Mat o;
o.data[1][1]=o.data[1][2]=o.data[2][1]=1;
o=Mpow(o,n);
cout<<o.data[1][2];
return 0;
}
本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9247444.html