Problem:
観音堂

一郎君の家の裏山には観音堂があります。この観音堂まではふもとから 30 段の階段があり、一郎君は、毎日のように観音堂まで遊びに行きます。一郎君は階段を１足で３段まで上がることができます。遊んでいるうちに階段の上り方の種類（段の飛ばし方の個数）が非常にたくさんあることに気がつきました。

そこで、一日に 10 種類の上り方をし、すべての上り方を試そうと考えました。しかし数学を熟知しているあなたはそんなことでは一郎君の寿命が尽きてしまうことを知っているはずです。

一郎君の計画が実現不可能であることを一郎君に納得させるために、階段の段数 n を入力とし、一日に 10 種類の上り方をするとして、一郎君がすべての上り方を実行するのに要する年数を出力するプログラムを作成してください。一年は 365 日として計算してください。一日でも必要なら一年とします。365 日なら 1 年であり、366 日なら 2 年となります。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。
各データセットとして、段数を表す１つの整数 n (1 ≤ n ≤ 30) が１行に与えられます。

データセットの数は 30 を超えません。

Output

データセットごとに一郎君がすべての上り方を実行するのに必要な年数（整数）を１行に出力します。

Sample Input

1
10
20
25
0

Output for the Sample Input

1
1
34
701

Solution in JAVA (judge verdict: Accepted)

import java.util.*;
public class Main {
    static Scanner sc = new Scanner(System.in);
    static int n;
    static long[][] dp = new long[31][31];
    public static void main(String[] args) {
        makeDpTable();
        while(read()){
            solve();
        }
    }

    static void makeDpTable(){
        dp[0][0] = 1;
        for(int i = 1; i < dp.length; i++){
            for(int j = 1; j < dp[0].length; j++){
                for(int k = 1; k <=3; k++){
                    if(j-k <0)continue;
                    dp[i][j] += dp[i-1][j-k];
                }
            }
        }
    }
    static boolean read(){
        n = sc.nextInt();
        if( n == 0 ) return false;
        return true;
    }

    static void solve(){
        int res = 0;
        for(int i = 1; i <= n; i++){
            res += dp[i][n];
        }

        System.out.println((res/10-1)/365+1);
    }
}