WA on #2 #10
#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;++i)
using namespace std;
const int maxn=5,mod=1e9+7;
struct M{
int n,m,a[maxn][maxn];
M(){memset(a,0,sizeof a);}
}A,B,C,D,E;
M operator*(M &x,M &y){
M ans;ans.n=x.n;ans.m=y.m;
rep(i,1,ans.n)rep(j,1,ans.m)rep(k,1,x.m) ans.a[i][j]=(ans.a[i][j]+1ll*x.a[i][k]*y.a[k][j])%mod;
return ans;
}
M ksm(M &x,int y){
if(y==0) return B;
C=ksm(x,y/2);C=C*C;
return y&1?C*x:C;
}
int main(){
A.n=A.m=2;
A.a[1][1]=A.a[1][2]=A.a[2][1]=1;
B.n=B.m=2;
B.a[1][1]=B.a[2][2]=1;
E.n=2,E.m=1;
E.a[1][1]=E.a[2][1]=1;
int n;
cin>>n;
if(n<=2)cout<<1,exit(0);
D=ksm(A,n-2);
D=D*E;
cout<<D.a[1][1];
return 0;
}