/************************************************
Algorithmen und Problemloesungen mit C++,
http://www.algorithmen-und-problemloesungen.de
Copyright @2007 by Doina Logofatu
************************************************/
#include <iostream>                                
#include <fstream> 
#include <vector> 
#include <algorithm> 

const MAX_NO = 20;

using namespace std;

typedef pair<long, long> TFraction;

long gcd(long a,  long b){    
  long r;
  while( b != 0){
    r = a % b;
    a = b;
    b = r;
  }
  return a;
}

void simplifyFraction(TFraction &f){
  long d;
  d = gcd(f.first, f.second);
  if(!d){ 
    cout << "Error!!! Division by 0!"; 
    return;
  }
  f.first /= d; f.second /= d;
  if(f.second < 0){
    f.second *= -1;
    f.first *= -1;
  }
}

TFraction sumFractions(TFraction& f1, TFraction& f2){
  TFraction f;
  simplifyFraction(f1); simplifyFraction(f2);
  f.first = f1.first*f2.second + f1.second*f2.first;
  f.second = f1.second*f2.second;
  simplifyFraction(f);
  return f;
}

long lcmDenomin(TFraction fr[MAX_NO], short n){
  long  m;
  short isM;
  vector<long> v;
  for(int i=0; i<n; i++){
    if(fr[i].first!=0) v.push_back(fr[i].second);
  }  
  sort(v.begin(), v.end());  
  if(v.size()<1) return 1;
  m = v[v.size()-1]; isM = 0;
  while(!isM){
    isM = 1;
    for(size_t i=1; i<v.size() && isM; i++)
      if(m%v[i] != 0){isM = 0; break;}
    m++;
  }
  m--;	
  return m;
}

void genCombinations(long C[MAX_NO+2][MAX_NO+2], short n){
  short i, j;  
  C[0][0] = 1;
  for(i=1; i<=n; i++){
    C[i][0] = C[i][i] = 1;  
    for(j=1; j<i; j++)
      C[i][j] = C[i-1][j-1]+C[i-1][j];
  }
}

int main(){
  long C[MAX_NO+2][MAX_NO+2];  
  long A[MAX_NO+1][MAX_NO+2];
  long M[MAX_NO+1], Q;
  short k,p, t, r, sign;
  TFraction fr[MAX_NO+2], W[MAX_NO+1], fAux, fAux2;   
  genCombinations(C, MAX_NO+1);
  ifstream in("psum.in");
  ofstream out("psum.out");
  M[0] = 1; A[0][1] = 1; A[0][0] = 0;
  for(p=1; p<=MAX_NO; p++){
    sign = 1;
    for(t=p-1; t>=0; t--){
      W[t].first = sign*C[p+1][p+1-t]; 
      W[t].second = M[t]; 
      sign *= -1;
      simplifyFraction(W[t]);		   
    }
    for(t=p; t>=0; t--){
      fAux.first = 0; fAux.second = 1;		   
      for(r=p-1; r>=t-1 && r>=0; r--){
        fAux2.first  = W[r].first * A[r][t];			   
        fAux2.second = W[r].second;			   
        simplifyFraction(fAux2);
        fAux = sumFractions(fAux, fAux2);
      }
      fr[t] = fAux;
    }	  
    fAux2.first=W[0].first*A[0][0];
    fAux2.second =W[0].second;
    simplifyFraction(fAux2);
    fr[0] = sumFractions(fr[0], fAux2);
    fr[p+1].first = 1; fr[p+1].second = 1;
    Q = lcmDenomin( fr, p+1 );
    M[p] = (p+1)*Q;
    for(t=p+1; t>=0; t--){
      fAux2.first = fr[t].first*Q;
      fAux2.second = fr[t].second;
      simplifyFraction(fAux2);
      A[p][t] = fAux2.first;
    }	   
  }   
  while(in && !in.eof() && in>>k){
    out << M[k] << " ";
    for(t=k+1; t>=0; t--){
      out << A[k][t] << " ";
    }
    out << endl;
  }
  return 0;
}
