/****************************************************************
  目盛の消えたものさし
  by Naoyuki Tamura (tamura@kobe-u.ac.jp)

  使い方: measure N M
  例:	  measure 17 6
****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

#define MAX_LEN	(100)
#define	YES	(1);
#define	NO	(0);

void usage(void);
void measure(int, int);
void solve(int, int);
void show(void);

jmp_buf jmpbuf;
int count = 0;
int len;
int part;
int mark[MAX_LEN+1];
int once;

int main(int argc, char *argv[])
{
    int n, m;
    
    if (argc != 3) {
	usage();
	return 1;
    }
    n = atoi(argv[1]);
    m = atoi(argv[2]);
    if (n < 2 || MAX_LEN < n || m < 1 || n < m) {
	usage();
	return 1;
    }
    once = NO;
    measure(n, m);
    return 0;
}


void usage()
{
    printf("Usage: measure N M\n");
}


void measure(int n, int m)
{
    int i;

    count = 0;
    len = n;
    part = m;
    for (i = 0; i <= len; ++i)
      mark[i] = NO;
    mark[0] = YES;
    mark[len] = YES;
    mark[1] = YES;
    if (setjmp(jmpbuf)) {
	return;
    }
    solve(len, m-2);
}


void solve(int k, int m)
{
    int i;

    if (k <= 0) {
	if (m == 0) {
	    ++count;
	    show();
	    if (once) {
		longjmp(jmpbuf, 1);
	    }
	}
	return;
    }
    for (i = 0; i <= len-k; ++i) {
	if (mark[i] && mark[i+k]) {
	    solve(k-1, m);
	    return;
	}
    }
    if (m >= 1) {
	for (i = 0; i <= len; ++i) {
	    if (mark[i])
	      continue;
	    if ((i-k >= 0 && mark[i-k]) || (i+k <= len && mark[i+k])) {
		mark[i] = YES;
		--m;
		solve(k-1, m);
		++m;
		mark[i] = NO;
	    }
	}
    }
    if (m >= 2) {
	for (i = 0; i <= len-k; ++i) {
	    if (mark[i] || mark[i+k])
	      continue;
	    mark[i] = YES;
	    mark[i+k] = YES;
	    m -= 2;
	    solve(k-1, m);
	    m += 2;
	    mark[i] = NO;
	    mark[i+k] = NO;
	}
    }
}


void show()
{
    int i, j;
    char *delim;

    printf("%d(%d)", len, part);
    j = 0;
    delim = "=";
    for (i = 1; i <= len; ++i) {
	if (mark[i]) {
	    printf("%s%d", delim, i-j);
	    j = i;
	    delim = "+";
	}
    }
    printf("\n");
}

/*
 Local Variables:
 mode: c
 c-basic-offset: 4
 End:
*/

