斐波那契-----------------------------思维(结论)

在这里插入图片描述
在这里插入图片描述

解析:

斐波那契数列的前n项平方和=f(n) * f(n+1)

第n项和第n+1项用矩阵快速幂求即可

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int N=2;
ll tmp[N][N],res[N][N];
void multi(ll a[][N],ll b[][N],int n)
{
    memset(tmp,0,sizeof(tmp));
    for(ll i=0;i<n;i++)
    {
	   for(ll j=0;j<n;j++)
	   {
        for(ll k=0;k<n;k++)
        {
        tmp[i][j]+=(a[i][k]*b[k][j])%mod;
        }
        tmp[i][j]=tmp[i][j]%mod;
      }
   }
    for(ll i=0;i<n;i++)
        for(ll j=0;j<n;j++)
        a[i][j]=tmp[i][j];
}
void Pow(ll a[][N],ll m,int n)
{
    memset(res,0,sizeof(res));//m是幂,n是矩阵大小
    for(ll i=0;i<n;i++) res[i][i]=1;
    while(m)
    {
	    if(m&1)
        multi(res,a,n);//res=res*a;复制直接在multi里面实现了;
        multi(a,a,n);//a=a*a
        m>>=1;
    }
}
int main()
{
     ll m;
     ll c,b;
     int n;
     ll a[N][N]; 
    scanf("%lld",&m) ;
     
         n=2;
    	a[0][0]=1,a[0][1]=1,a[1][0]=1,a[1][1]=0;
		Pow(a,m,n);
		c=res[1][0];
		   n=2;
    	a[0][0]=1,a[0][1]=1,a[1][0]=1,a[1][1]=0;
		Pow(a,m+1,n);
		b=res[1][0];
 	   printf("%lld\n",c*b%mod);
		
   return 0;
}
发布了491 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43690454/article/details/104791297