【矩陣乘法】洛谷P1962 斐波那契數列
阿新 • • 發佈:2018-12-09
連結
大意
求出斐波那契的第項
思路
矩陣乘法加速遞推 時間複雜度:
程式碼
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ymw 1000000007
using namespace std;long long n;
struct node{int a[3][3],r,c;};
inline node mul(node x,node y)//返回x乘y的值
{
node z;
memset (&z,0,sizeof(z));
for(register int i=0;i<x.r;i++)
for(register int j=0;j<y.c;j++)
for(register int k=0;k<x.c;k++)
z.a[i][j]=(z.a[i][j]%ymw+(long long)x.a[i][k]*y.a[k][j]%ymw)%ymw;
z.r=x.r;z.c=y.c;
return z;
}
inline int ksm(register long long y)//快速冪
{
node x,ans;
memset (&x,0,sizeof(x));
memset(&ans,0,sizeof(ans));
x.r=x.c=ans.c=2;
ans.r=1;
x.a[0][0]=x.a[1][0]=x.a[0][1]=1;
ans.a[0][0]=ans.a[0][1]=1;
while(y)
{
if(y&1) ans=mul(ans,x);
x=mul(x,x);
y>>=1;
}
return ans.a[0][0]%ymw;
}
signed main()
{
scanf ("%lld",&n);
if(n<3) return putchar(49)&0;
printf("%d",ksm(n-2));
}