题目描述 https://loj.ac/problem/10220
求斐波那契数列的第n项,由于数很大,直接递推会超时超空间,这就需要用到矩阵乘法,由于数很大,要开long long,乘的时候也注意数据大小。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
struct node
{
int m[3][3];
}a,b,e;
ll n,modd;
node c(node x,node y)
{
node z;
memset(z.m,0,sizeof(z.m));
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
z.m[i][j]=(z.m[i][j]+(ll)x.m[i][k]*y.m[k][j]%modd)%modd;
return z;
}
node ff(node b,ll p)
{
node s=e;
while(p!=0)
{
if(p%2==1) s=c(s,b);
b=c(b,b);
p/=2;
}
return s;
}
int main()
{
scanf("%lld%lld",&n,&modd);
e.m[1][1]=e.m[2][2]=1,b.m[1][1]=b.m[1][2]=1;
a.m[1][1]=a.m[1][2]=a.m[2][1]=1;
if(n<=2) puts("1");
if(n>=3)
{
node ans=c(b,ff(a,n-2));
cout<<ans.m[1][1];
}
return 0;
}