Go: package main

import (
	"bufio"
		"os"
	"strconv"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	dp := make([]int , 30)
	dp[0] = 1 // 1段の階段の登り方
	dp[1] = 2 // 2段の階段の登り方
	dp[2] = 4 // 3段の階段の登り方
	for i := 3; i < 30; i++ {
		// n段の階段の登り方は
		// n-1段の階段の登り方+n-2段の階段の登り方+n-3段の階段の登り方
		dp[i] = dp[i-1]+dp[i-2]+dp[i-3] 
	}
	for scanner.Scan() {
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}
		fmt.Println(((dp[n-1]+9)/10+364)/365)
	}
}

C++: #include<iostream>

using namespace std;

int ProgressNumberOfYears(int step_num, int step_kind)
{

  if(step_num == 0)
    return 1;
  else if(step_num < 0)
    return 0;

  int count = 0;

  for(int i = 1; i < 4; ++i)
    {

      count = count + ProgressNumberOfYears(step_num - i,i);

    }

  return count;

}

int main()
{

  int step_num;
  int day;
  double temp;


  cin >> step_num;

  while(cin >> step_num && step_num != 0)
    {

      temp = ProgressNumberOfYears(step_num,0)/10.0/365.0;
      day = (int)ProgressNumberOfYears(step_num,0)/10.0/365.0;
      if(temp - day > 0) cout << day + 1 << endl;
      else if(temp == day)cout << day << endl;

    }

  return 0;

}

C++: #include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<vector>
#include<complex>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<numeric>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>

#define MP make_pair
#define PB push_back
#define ALL(x) (x).begin(),(x).end()
#define REP(i,n) for(int i=0;i<(n);i++)
#define REP1(i,n) for(int i=1;i<(n);i++)
#define REP2(i,d,n) for(int i=(d);i<(n);i++)
#define RREP(i,n) for(int i=(n);i>=0;i--)
#define CLR(a)      memset((a),0,sizeof(a))
#define MCLR(a)     memset((a),-1,sizeof(a))
#define RANGE(x,y,maxX,maxY) (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY))

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<VI > VVI;
typedef vector<string> VS;
typedef vector<LL> VLL;
typedef pair<int,int> PII;

const int INF = 0x3f3f3f3f;
const LL INFL = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-9;

const int DX[]={1,0,-1,0},DY[]={0,-1,0,1};
 
VI memo;

int f(int n){
	if(n<0)
		return 0;
	if(n==0)
		return 1;
	if ( memo[n]!= -1 )
		return memo[n];
	return f(n-1)+f(n-2)+f(n-3);
}

int main(){
	int n;
	memo.resize(31,-1);
	while(1){
		cin >> n;
		if(n==0)
			break;
		int num=f(n);
		cout <<num/10/365+1<< endl;
	}
	return 0;  
}

C++: #include<iostream>


typedef struct k {
	int N;
	int day;
};

int main() {
	k a[30];
	int c,N[1000],c2;

	a[0].day = 1;
	a[1].day = 2;
	a[2].day = 3;

	for (c = 3; c < 30; ++c) {
		a[c].day = a[c - 1].day + a[c - 2].day + a[c - 3].day;
		a[c].N = a[c].day/365;
		if (a[c].day % 365>0)a[c].N++;
	}


	std::cin >> N[0];
	for (c = 1; N[c - 1] != 0;++c)
	{
		std::cin >> N[c];
	}
	c2 = c;
	for (c = 0; c < c2; ++c) {
		std::cout << a[N[c]].N << "\n";
	}

	






	
}

C++: #include <iostream>
using namespace std;
int main(void){
	int dp[31];
	dp[0]=dp[1]=1;
	dp[2]=dp[1]+1;
	for(int i=3;i<=30;i++)
		dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
	for(int i=1;i<=30;i++)
		dp[i]=dp[i]/3650+1;
	int n;
	while(cin >> n,n){
		cout << dp[n] << endl;
	}
	return 0;
}

C++: #include <bits/stdc++.h>

using namespace std;

#define all(c) (c).begin(), (c).end()
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

int main() {
    int dp[31] = {};
    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;
    rep(i, 31) if (i > 2) dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
    int n;
    while(cin >> n, n) {
        int ans = dp[n];
        // cout << ans << endl;
        ans = (ans / 10 + 365) / 365;
        cout << ans << endl;
    }

    return 0;
}

C++: #include<iostream>
#include<iomanip>
#include<algorithm>
#include<string>
#include<vector>
#include<deque>
#include<queue>

using std::cout;
using std::cin;
using std::setw;
using std::setfill;
using std::string;
using std::pair;
using std::make_pair;
using std::vector;
using std::queue;
using std::deque;
using std::priority_queue;
using std::next_permutation;
//using std::iota;
using std::sort;
using std::greater;
using std::max;
using std::min;

#define INF 999999999;
#define MOD 1000000007

#define EVEL 1

#ifndef EVEL
#define dbug(X) std::cout << #X << ":" <<X<<" " ;
#define dbugf(s) std::cout << s << " ";
#define dbugln std::cout<<"\n";
#else
#define dbug(X) {}
#define dbugf(s) {}
#define dbugln {}
#endif

int N;
unsigned long long int A[35];

int main(){
	cin.tie(0);
	std::ios::sync_with_stdio(false);
    A[0] = 1;
    for(int i=1; i <= 30; i++){
        if(i==1)A[i] = A[i-1];
        else if(i==2)A[i] = A[i-1]+A[i-2];
        else if(i>=3)A[i] = A[i-1]+A[i-2]+A[i-3];
    }
    while(1){
        cin >> N;
        if(N == 0)break;
        cout << (A[N]+3650)/3650<< '\n';
    }

    return 0;
}