P1962 斐波那契数列(矩阵快速幂)

	#include<bits/stdc++.h>
	#define int long long
	using namespace std;
	int n,a[3],m=1e9+7,c[3][3],b[3][3],x[3][3],a1[3];
	void first()
	{
	    for(int i=1;i<=2;i++)
	    	for(int j=1;j<=2;j++) x[i][j]=0;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            for(int k=1;k<=2;k++)
	                x[i][j]=(x[i][j]+b[i][k]*c[k][j])%m;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            b[i][j]=x[i][j];
	}
	void second()
	{
	    for(int i=1;i<=2;i++)
	    	for(int j=1;j<=2;j++) x[i][j]=0;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            for(int k=1;k<=2;k++)
	                x[i][j]=(x[i][j]+c[i][k]*c[k][j])%m;
	    for(int i=1;i<=2;i++)
	        for(int j=1;j<=2;j++)
	            c[i][j]=x[i][j];
	}
	signed main()
	{
	    a[1]=1;
	    a[2]=1;
	    scanf("%ld",&n);
	    if(n<=2){cout<<1;return 0;}else n-=2;
	    for(int i=1;i<=2;i++) b[i][i]=1;
	    for(int i=1;i<=2;i++){
	        for(int j=1;j<=2;j++) if(!(i==2&&j==2)) c[i][j]=1;
		}
	    while(n)
	    {
	        if(n%2==1) first();
	        n/=2;
	        second();
	    }
		for(int i=1;i<=2;i++)
	   		for(int j=1;j<=2;j++)
	       		a1[i]=(a1[i]+b[i][j]*a[j])%m;
		cout<<a1[1];
	    return 0;
	}
posted @ 2024-01-25 16:28  Arthur_Douglas  阅读(17)  评论(0编辑  收藏  举报