#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
class largeNumber{
public:
// constructor
largeNumber(void);
// constructor
largeNumber(const std::string& a);
// deconstructor
~largeNumber(void);
// wrapper of std::string
char operator[](unsigned int i) const {
return rawString[i];
}
unsigned int length() const {
return (unsigned int)rawString.length();
}
// align the string
void alignDigits(std::string& leftString, std::string& rightString) const;
// add operation
const largeNumber operator +(const class largeNumber& right) const;
// add operation
largeNumber& operator +=(const largeNumber& right){
*this = *this + right;
return *this;
}
// substitution
largeNumber& operator =(const largeNumber& a){
rawString = a.rawString;
return *this;
}
std::string getString() const {
return rawString;
}
private:
// container of the actual index/key/value
std::string rawString;
};
std::ostream& operator << (std::ostream& out, const largeNumber& right);
largeNumber::largeNumber(void)
{
}
largeNumber::~largeNumber(void)
{
}
largeNumber::largeNumber(const std::string& a){
rawString = a;
bool hasNonNumberCharacter = false;
for(unsigned int i = 0;i < rawString.length();i++){
if(rawString[i] < '0' || '9' < rawString[i]){
hasNonNumberCharacter = true;
break;
}
}
if(hasNonNumberCharacter){
rawString = '0';
}
}
void largeNumber::alignDigits(std::string& leftString, std::string& rightString) const {
unsigned int maxLength = leftString.length() < rightString.length() ? rightString.length() : leftString.length(); // get the length of longest string
int offset = (int)maxLength - (int)leftString.length();
while(offset >= 0){
leftString.insert(leftString.begin(), '0');
offset--;
}
offset = (int)maxLength - (int)rightString.length();
while(offset >= 0){
rightString.insert(rightString.begin(), '0');
offset--;
}
return;
}
const largeNumber largeNumber::operator +(const class largeNumber& right) const {
std::string leftString = rawString;
std::string rightString = right.rawString;
alignDigits(leftString, rightString);
char carryUp = 0;
int i =0;
for(i = leftString.length()-1;i > 0;i--){
char a = leftString[i] - '0';
char b = rightString[i] - '0';
char c = a + b + carryUp;
if(10 <= c){
carryUp = 1;
c -= 10;
}else{
carryUp = 0;
}
leftString[i] = c + '0';
}
if(carryUp == 1){
// When carry up happens at the MSB
leftString[0] = carryUp + '0';
}else{
// else
leftString.erase(0,1);
}
return largeNumber(leftString);
}
std::ostream& operator << (std::ostream& out, const largeNumber& right)
{
out << right.getString();
return out;
}
std::vector<class largeNumber> fibonacci;
class largeNumber simpleFibonacciNumber2(int i)
{
if(fibonacci.empty())
{
fibonacci.push_back(largeNumber("0"));
}
if(fibonacci.size() == 1)
{
fibonacci.push_back(largeNumber("1"));
}
if(fibonacci.size() == 2)
{
fibonacci.push_back(largeNumber("1"));
}
if(i <= 0)
{
return largeNumber("0");
}
if((unsigned int)i < fibonacci.size())
{
return fibonacci[i];
}
for(unsigned int j = fibonacci.size()-1;j < (unsigned int)i;j++)
{
class largeNumber p = fibonacci[fibonacci.size()-1];
class largeNumber q = fibonacci[fibonacci.size()-2];
fibonacci.push_back(p+q);
}
return fibonacci[i];
}
class largeNumber solveMayoiDoro(int n)
{
class largeNumber retValue("0");
for(int i = 1;i <= n;i += 2)
{
retValue += simpleFibonacciNumber2(i+2);
}
return retValue;
}
int main(int argc, char **argv)
{
using namespace std;
std::string stub;
cin >> stub;
int i = atoi(stub.c_str());
cout << solveMayoiDoro(i) << endl;
return 0;
}