#include<stdio.h>
#define SIZE 100 /*結果記録用の配列の大きさ*/

/* 分割方法を再帰的に出力する関数．分割の総数を返す．
nは分割する数，resultは分割結果を記録する配列，iは配列resultに書き込む位置*/
int operator(int n, int result[], int i)
{
  int j, count = 0;
  int result2[SIZE];

  /*配列をコピー*/
  for(j=0;j<SIZE;j++) result2[j] = result[j];

  /*nが2のときは結果を出力*/
  if(n==2){
    result[i] += 2;
    for(j=0;j<i;j++) printf("%d+",result[j]);
    printf("%d\n",result[j]);
    count = 1;
  }
  else{
    /*result[i]に2を加えて，operator(n-2, result, i+1)を呼び出す*/
    if(n>3){
      result[i] += 2;
      count += operator(n-2, result, i+1);
    }
    /*result[i]に1を加えて，operator(n-1, result2 ,i)を呼び出す*/
    if(n>2){
      result2[i]++;
      count += operator(n-1, result2 ,i);
    }
  }

  return(count);
}

main()
{
  int i;            /*ループインデックス*/
  int n;            /*分割する数*/
  int count;        /*分割の総数*/
  int result[SIZE]; /*分割結果記録用の配列*/
  
  /*配列の初期化*/
  for(i=0;i<SIZE;i++) result[i] = 0;

  /*分割する数nを得る*/
  printf("n = ");
  scanf("%d",&n);
  /*分割の実行*/
  count = operator(n, result, 0);
  /*分割の総数の表示*/
  printf("count = %d\n",count);
}
