import java.util.*;
import java.math.*;
/*
*
除了找规律,我也不知道说什么,尽管我是抄的
这次下面有程序了,hahaha
*
java开大整数数组
1.格式: 类型 []数组名=new 类型[大小];
2.赋值 数组名[index]=BigInteger.valueOf(???)
*/
public class Main {
public static void main(String args[]) {
BigInteger []dp=new BigInteger[10010];
dp[3]=BigInteger.valueOf(4);
dp[4]=BigInteger.valueOf(7);
for(int i=5;i<=10000;i++) {
dp[i]=dp[i-1].add(dp[i-2]);
}
Scanner cin=new Scanner(System.in);
while(cin.hasNext()) {//连续输入
int n=cin.nextInt();//按照类型取值
System.out.println(dp[n]);
}
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)
const int maxn=2050;//2^10
const int mod=1e9+7;
/*
求点数10以内的匹配的个数,便于找规律
dp[S]=dp[S]+dp[S-u-v]
*/
int bit[maxn];
int dp[maxn],ans[maxn];
void init(){
rep(i,1,1<<10){
int ans=0,v=i;
while(v){
v-=(v&(-v));
ans++;
}
bit[i]=ans/2;
}
}
int main(){
init();
int n;
while(scanf("%d",&n)==1){
memset(ans,0,sizeof(ans));
memset(dp,0,sizeof(dp));
dp[0]=1;
rep(i,1,n+1){
//printf("***u:%d\n",u);
int u=i,v=u==n?1:u+1;
u--,v--;
per(j,1,(1<<n)){//!!!移位都加上(),我也不知道发生了什么,反正不对
if((j&(1<<u))&&(j&(1<<v))){
dp[j]+=dp[j-(1<<u)-(1<<v)];
ans[bit[j]]+=dp[j-(1<<u)-(1<<v)];
dp[j]=(dp[j]%mod+mod)%mod;
ans[bit[j]]=(ans[bit[j]]%mod+mod)%mod;
}
}
}
int sum=0;
rep(j,1,n/2+1){
sum+=ans[j];
printf("%d%c",ans[j],j==n/2?'\n':' ');
}
printf("sum:%d\n",sum+1);//加上空
}
return 0;
}