#include<iostream>
#include<cstdio>
#include<algorithm>
#include<memory.h>
#include<cmath>
#include<queue>
#define oo 2147483647
using namespace std;
int v[n];
bool vis[n];
int dis[n];
int num;
struct my
{int x,y,l,ne;}e[m];
queue<int>q;
void put(int x,int y,int l)
{
num++;
e[num].x=x;
e[num].y=y;
e[num].l=l;
e[num].ne=v[x];
v[x]=num;
}
//C++读入黑科技
inline long long getint()
{
long long _x=0;
char _ch;
for(_ch=getchar();_ch>'9'||_ch<'0';_ch=getchar());
for(;_ch<='9'&&_ch>='0';_ch=getchar())
_x=_x*10+_ch-48;
return _x;
}
//最短路
//#1~spfa
void spfa()
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
vis[S]=1;
dis[S]=0;
q.push(S);
while(!q.empty())
{
int x=q.front();
vis[x]=0;
q.pop();
for(int i=v[x];i;i=e[i].ne)
{
int y=e[i].y;
if(dis[y]>dis[x]+e[i].l)
{
dis[y]=dis[x]+e[i].l;
if(!vis[y])
{
q.push(y);
vis[y]=1;
}
}
}
}
vis[x]=0;
}
//#2~dijkstra
void dijkstra()
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)dis[i]=a[S][i];
vis[S]=true;
dis[S]=0;
for(int i=1;i<n;i++)
{
int _min=oo,k=0;
for(int j=1;j<=n;j++)
if(dis[j]<_min&&!vis[j])
{
_min=dis[j];
k=j;
}
vis[k]=true;
for(int j=1;j<=n;j++)
if(!vis[j])
dis[j]=min(dis[j],dis[k]+a[k][j]);
}
}
//#2+~dijkstra堆优化
{
struct QQ{int x,len;};
struct cmp
{
bool operator()(QQ a,QQ b){
return a.len>b.len;
}
};
priority_queue<QQ,vector<QQ>,cmp>q;
void dij(int start)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[start]=0;
q.push((QQ){start,0});
int x;
int y;
while(!q.empty())
{
x=q.top().x;
q.pop();
if(vis[x])continue;vis[x]=1;
for(int i=v[x];i;i=e[i].ne)
{
y=e[i].y;
if(dis[y]>dis[x]+e[i].l)
{
dis[y]=dis[x]+e[i].l;
q.push((QQ){y,dis[y]});
}
}
}
}
}
//#3~bellman-ford
void bellman-ford()
{
memset(dis,0x3f,sizeof(dis));
dis[S]=0;
for(int i=1;i<n;i++)
for(int j=1;j<=m;j++)
dis[e[j].y]=min(dis[e[j].y],dis[e[j].x]+e[j].l);
}
//#4~floyd k在最外重循环
//最小生成树
//#1~prim
void prim()
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)dis[i]=a[S][i];
vis[S]=true;
dis[S]=0;
for(int i=1;i<n;i++)
{
int _min=oo,k=0;
for(int j=1;j<=n;j++)
if(dis[j]<_min&&!vis[j])
{
_min=dis[j];
k=j;
}
vis[k]=true;
for(int j=1;j<=n;j++)
if(!vis[j])
dis[j]=min(dis[j],a[k][j]);
}
}
//#2~kruscal
void find(x)
{
if(fa[x]==x)return x;
else return find(fa[x]);
}
void kruscal()
{
sort(e+1,e+num+1,cmp);
for(int i=1;i<=n;i++)
fa[i]=i;
int tot=0;
int ans=0;
for(int i=1;i<=num;i++)
{
int x=e[i].x;
int y=e[i].y;
int f1=find(x);
int f2=find(y);
if(f1!=f2)
{
tot++;
ans+=e[i].l;
fa[f1]=f2;
if(tot==n-1)break;
}
}
}
//高精思想(以拓展斐波那契为例)
int main()
{
int a[104][104];
int n;
cin>>n;
memset(a,0,sizeof(a));
a[0][0]=0;
a[1][0]=0;
a[2][0]=1;
for(int i=3;i<=n;i++)
{
for(int j=0;j<=100;j++)
a[i][j]=a[i-1][j]+a[i-2][j];
for(int j=0;j<=100;j++)
if(a[i][j]>=10)
{
a[i][j+1]+=a[i][j]/10;
a[i][j]=a[i][j]%10;
}
}
int t=100;
while(a[n][t]==0&&t>0)t--;
for(int i=t;i>=0;i--)
cout<<a[n][i];
return 0;
}
//归排&逆序对
void msort(int l,int r)
{
if(l==r)return;
else
{
int mid=(l+r)/2;
int a=l,b=mid+1,c=1;
msort(l,mid);
msort(mid+1,r);
while(a<=mid&&b<=r)
{
if(arr[a]>arr[b])
{
t[c]=arr[b];
num+=mid-a+1;//求逆序对的核心程序
c++;
b++;
}
else{
t[c]=arr[a];
c++;
a++;}
}
while(a<=mid)
{
t[c]=arr[a];
a++;
c++;
}
while(b<=r)
{t[c]=arr[b];
b++;
c++;}
for(int i=1;i<=r-l+1;i++)
arr[l-1+i]=t[i];
}
}
//快速幂
void pow_mod(int a,int n,int q)//q为mod值
{
int ans=1;
for(;n;n>>=1,a=a*a%q)
if(n&1)
ans=ans*a%q;
}
//RMQ
void init_rmq(int n)
{
for(int i=1;i<=n;i++)
f[i][0]=a[i];
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
if(i+(1<<j)-1<=n)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
void query_rmq(int i,int j)
{
int k=log(j-i+1)/log(2);
return max(f[i][k],f[j-(1<<k)+1][k]);
}
//LCA-tarjan
//sort的应用;
//1、可以传入两个参数;
sort(a,a+N) //其中a是数组,a+N表示对a[0]至a[N-1]的N个数进行排序(默认从小到大排序);
//2、传入三个参数;
sort(a,a+N,cmp)//第三个参数是一个函数;
//如果让函数从大到小排序,可以用如下算法实现;
bool cmp(int a,int b){return a>b};
sort(A,A+N,cmp);
//stable_sort与sort实现方法相同
//分配动态数组
int* mark_=new int[n+1];
//定义输出场宽、精确位数
#include<iomanip>
cout<<setw(m)<<fixed<<setprecision(n)<<x<<endl;
//m为场宽,n为保留位数
#include<cstdio>
#include<algorithm>
#include<memory.h>
#include<cmath>
#include<queue>
#define oo 2147483647
using namespace std;
int v[n];
bool vis[n];
int dis[n];
int num;
struct my
{int x,y,l,ne;}e[m];
queue<int>q;
void put(int x,int y,int l)
{
num++;
e[num].x=x;
e[num].y=y;
e[num].l=l;
e[num].ne=v[x];
v[x]=num;
}
//C++读入黑科技
inline long long getint()
{
long long _x=0;
char _ch;
for(_ch=getchar();_ch>'9'||_ch<'0';_ch=getchar());
for(;_ch<='9'&&_ch>='0';_ch=getchar())
_x=_x*10+_ch-48;
return _x;
}
//最短路
//#1~spfa
void spfa()
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
vis[S]=1;
dis[S]=0;
q.push(S);
while(!q.empty())
{
int x=q.front();
vis[x]=0;
q.pop();
for(int i=v[x];i;i=e[i].ne)
{
int y=e[i].y;
if(dis[y]>dis[x]+e[i].l)
{
dis[y]=dis[x]+e[i].l;
if(!vis[y])
{
q.push(y);
vis[y]=1;
}
}
}
}
vis[x]=0;
}
//#2~dijkstra
void dijkstra()
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)dis[i]=a[S][i];
vis[S]=true;
dis[S]=0;
for(int i=1;i<n;i++)
{
int _min=oo,k=0;
for(int j=1;j<=n;j++)
if(dis[j]<_min&&!vis[j])
{
_min=dis[j];
k=j;
}
vis[k]=true;
for(int j=1;j<=n;j++)
if(!vis[j])
dis[j]=min(dis[j],dis[k]+a[k][j]);
}
}
//#2+~dijkstra堆优化
{
struct QQ{int x,len;};
struct cmp
{
bool operator()(QQ a,QQ b){
return a.len>b.len;
}
};
priority_queue<QQ,vector<QQ>,cmp>q;
void dij(int start)
{
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[start]=0;
q.push((QQ){start,0});
int x;
int y;
while(!q.empty())
{
x=q.top().x;
q.pop();
if(vis[x])continue;vis[x]=1;
for(int i=v[x];i;i=e[i].ne)
{
y=e[i].y;
if(dis[y]>dis[x]+e[i].l)
{
dis[y]=dis[x]+e[i].l;
q.push((QQ){y,dis[y]});
}
}
}
}
}
//#3~bellman-ford
void bellman-ford()
{
memset(dis,0x3f,sizeof(dis));
dis[S]=0;
for(int i=1;i<n;i++)
for(int j=1;j<=m;j++)
dis[e[j].y]=min(dis[e[j].y],dis[e[j].x]+e[j].l);
}
//#4~floyd k在最外重循环
//最小生成树
//#1~prim
void prim()
{
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)dis[i]=a[S][i];
vis[S]=true;
dis[S]=0;
for(int i=1;i<n;i++)
{
int _min=oo,k=0;
for(int j=1;j<=n;j++)
if(dis[j]<_min&&!vis[j])
{
_min=dis[j];
k=j;
}
vis[k]=true;
for(int j=1;j<=n;j++)
if(!vis[j])
dis[j]=min(dis[j],a[k][j]);
}
}
//#2~kruscal
void find(x)
{
if(fa[x]==x)return x;
else return find(fa[x]);
}
void kruscal()
{
sort(e+1,e+num+1,cmp);
for(int i=1;i<=n;i++)
fa[i]=i;
int tot=0;
int ans=0;
for(int i=1;i<=num;i++)
{
int x=e[i].x;
int y=e[i].y;
int f1=find(x);
int f2=find(y);
if(f1!=f2)
{
tot++;
ans+=e[i].l;
fa[f1]=f2;
if(tot==n-1)break;
}
}
}
//高精思想(以拓展斐波那契为例)
int main()
{
int a[104][104];
int n;
cin>>n;
memset(a,0,sizeof(a));
a[0][0]=0;
a[1][0]=0;
a[2][0]=1;
for(int i=3;i<=n;i++)
{
for(int j=0;j<=100;j++)
a[i][j]=a[i-1][j]+a[i-2][j];
for(int j=0;j<=100;j++)
if(a[i][j]>=10)
{
a[i][j+1]+=a[i][j]/10;
a[i][j]=a[i][j]%10;
}
}
int t=100;
while(a[n][t]==0&&t>0)t--;
for(int i=t;i>=0;i--)
cout<<a[n][i];
return 0;
}
//归排&逆序对
void msort(int l,int r)
{
if(l==r)return;
else
{
int mid=(l+r)/2;
int a=l,b=mid+1,c=1;
msort(l,mid);
msort(mid+1,r);
while(a<=mid&&b<=r)
{
if(arr[a]>arr[b])
{
t[c]=arr[b];
num+=mid-a+1;//求逆序对的核心程序
c++;
b++;
}
else{
t[c]=arr[a];
c++;
a++;}
}
while(a<=mid)
{
t[c]=arr[a];
a++;
c++;
}
while(b<=r)
{t[c]=arr[b];
b++;
c++;}
for(int i=1;i<=r-l+1;i++)
arr[l-1+i]=t[i];
}
}
//快速幂
void pow_mod(int a,int n,int q)//q为mod值
{
int ans=1;
for(;n;n>>=1,a=a*a%q)
if(n&1)
ans=ans*a%q;
}
//RMQ
void init_rmq(int n)
{
for(int i=1;i<=n;i++)
f[i][0]=a[i];
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
if(i+(1<<j)-1<=n)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
void query_rmq(int i,int j)
{
int k=log(j-i+1)/log(2);
return max(f[i][k],f[j-(1<<k)+1][k]);
}
//LCA-tarjan
//sort的应用;
//1、可以传入两个参数;
sort(a,a+N) //其中a是数组,a+N表示对a[0]至a[N-1]的N个数进行排序(默认从小到大排序);
//2、传入三个参数;
sort(a,a+N,cmp)//第三个参数是一个函数;
//如果让函数从大到小排序,可以用如下算法实现;
bool cmp(int a,int b){return a>b};
sort(A,A+N,cmp);
//stable_sort与sort实现方法相同
//分配动态数组
int* mark_=new int[n+1];
//定义输出场宽、精确位数
#include<iomanip>
cout<<setw(m)<<fixed<<setprecision(n)<<x<<endl;
//m为场宽,n为保留位数