矩阵快速幂,斐波那契数列

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
struct mat{ll a[2][2];};
ll n;
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]+=x.a[i][k]%MOD*y.a[k][j]%MOD)%=MOD;
    return res;
}
void mat_pow(ll 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);
	res.a[0][0]=1;res.a[0][1]=1;//递推数组初值:f[1]=1,f[2]=1
	while(n)
	{
		if(n&1) res=mat_mul(res,c);
		c=mat_mul(c,c);
		n=n>>1;
	}
	printf("%lld\n",res.a[0][0]);
}
int main()
{
	scanf("%lld",&n);
	if(n==1) printf("1\n");//注意特判 
	else mat_pow(n-2);//计算基础矩阵
	return 0;
}

posted @ 2025-08-14 11:28  majikko  阅读(16)  评论(0)    收藏  举报