思路:
矩阵快速幂;
来,上代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define mod 1000000007 struct MatrixType { long long ai[3][3]; void mem() { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) ai[i][j]=0; } } }; long long n; MatrixType mul(MatrixType a,MatrixType b) { MatrixType res; res.mem(); for(int i=1;i<=2;i++) { for(int j=1;j<=2;j++) { for(int v=1;v<=2;v++) res.ai[i][j]=(res.ai[i][j]+(a.ai[i][v]*b.ai[v][j])%mod)%mod; } } return res; } long long poww(long long mi) { MatrixType pos,mii; pos.mem(),mii.mem(); pos.ai[1][1]=1,pos.ai[1][2]=0; pos.ai[2][1]=0,pos.ai[2][2]=0; mii.ai[1][1]=1,mii.ai[1][2]=1; mii.ai[2][1]=1,mii.ai[2][2]=0; while(mi>0) { if(mi&1) pos=mul(pos,mii); mi=mi>>1,mii=mul(mii,mii); } return pos.ai[1][1]; } int main() { scanf("%lld",&n); cout<<poww(--n)%mod; return 0; }