原题大意:求斐波那契数列的某一项的值,该项特别大
要解决这个问题
其首先需要了解快速幂 重载运算符 取模这几个前置知识点
代码贴示如下:
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
struct ma{
long long a[3][3];
ma(){
memset(a,0,sizeof a);//在结构体中完成对数组清零
}
ma operator * (const ma &b) const{//重载运算符 * 变为矩阵乘法 (模板写法)
ma test;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
{
test.a[i][j]=(test.a[i][j]+a[i][k]*b.a[k][j])%mod;
}
return test;
}
}ans,base;
int main(){
base.a[1][1]=base.a[1][2]=base.a[2][1]=1;//赋值
ans.a[1][1]=ans.a[1][2]=1;
long long n;
cin>>n;
if (n<=2) {
cout<<"1";
return 0;
}
long long m=n-2;
while(m){//和快速幂很像
if(m&1) ans=ans*base;//m为奇数时
base=base*base;
m>>=1;
}
cout<<ans.a[1][1]%mod<<endl;
}