#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
struct matrix
{
int n,m;
int a[3][3];
matrix()
{
n=m=0;
memset(a,0,sizeof(a));
}
}A,B;
matrix operator*(const matrix &x,const matrix &y)
{//O(n^3)
//matrix z;
z.n = x.n;z.m = y.m;
for (int i=1;i<=z.n;i++)
for (int k=1;k<=x.m;k++)
for (int j=1;j<=z.m;j++)
z.a[i][j] = z.a[i][j] + x.a[i][k] * y.a[k][j];
return z;
}
matrix ksm(matrix a,int b)//计算a^b
{
if (b==0)
{
matrix c;
c.n=c.m=a.n;
for (int i=1;i<=c.n;i++)
c.a[i][i]=1;
return c;
}
matrix c = ksm(a,b/2);//c=a^(b/2)
c=c*c;
if (b&1) c=c*a;
return c;
}
int main()
{
A.n=1;A.m=2;
A.a[1][1]=0;A.a[1][2]=1;
B.n=2;B.m=2;
B.a[1][1]=0;B.a[1][2]=1;
B.a[2][1]=1;B.a[2][2]=1;
C = A * ksm(B,n);
cout << C.a[1][1] << "\n";
return 0;
}