LOJ#10220. Fibonacci 第 n 项【矩阵乘法】

题目描述 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;	
}

猜你喜欢

转载自blog.csdn.net/qq_42920122/article/details/88925932