import java.util.Scanner;
/*有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或者二级,要走上m级,共有多少走法?注:规定从一级到一级有0种走法。
给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100。为了防止溢出,请返回结果Mod 1000000007的值。*/
public static int countWays(int n) {
//递归解法 超时;采用动态规划方法求解
int dp[]=new int [n];
dp[0]=0;
dp[1]=1;
dp[2]=2;
if(n>2){
for(int i=3;i<n;i++){
dp[i]=(dp[i-1]+dp[i-2])%1000000007;
}
}
return dp[n-1];
/* if(n == 1){
return 0;
}else if( n ==2){
return 1;
}else if(n == 3){
return 2;
}else {
return (countWays(n-1) + countWays(n-2))% 1000000007;
}*/
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if(n<= 100){
System.out.println(countWays(n));
}
}
/*小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,
* 每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数)
给定四个整数A,B,C,D,请返回所求结果。*/
public void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int C = sc.nextInt();
int D = sc.nextInt();
System.out.println(calcDistance(A,B,C,D));
}
public int calcDistance(int A, int B, int C, int D) {
double len = 0;
len+= getlen(A * 1.0,0);
len+= getlen(B * 1.0,0);
len+= getlen(C * 1.0,0);
len+= getlen(D * 1.0,0);
return (int)Math.round(len);
//下落高度是x米 ,则有下落后弹起的高度是x/2,再落下去,又走了一个x/2,依此类推,一直下去,
//也就是总距离为 x+2*x(1/2+1/4+1/8+……),而括号中的数列是一个等比数列,其极限求和的结果就是1。所以 总距离就是3*x。
//return 3*(A+B+C+D);
}
public double getlen(double a, double sum) {
if (a<=0) {
return sum;
}
sum+=a+a/2;
return getlen(a/2, sum);
}