const string ALNUM = "0123456789abcdefghijklmnopqrstuvwxyz";
static void Main(string[] args)
{
  for (int i = 2; i <= 16; i++)
  {
    Console.WriteLine(i);
    int[] a = new int[i];
    int[] b = new int[i];
    for (int j = 0; j < i; j++)
      b[j] = 1;
    x(i, a, 0, b, 0);
  }
  Console.ReadKey();
}

static void x(int b, int[] a, int n, int[] e, int z)
{
  if (b == n)
  {
    if (Eq(a, e))
    {
      for (int i = 0; i < b; i++)
      {
        if (i > 0) Console.Write(", ");
        Console.Write("{0}*{1}", ToS(i, b), ToS(a[i], b));
      }
      Console.WriteLine();
    }
  }
  else
  {
    int m = b < 5
      ? 5
      : new List<int> {
          n > 1
            ? new List<int> { 4 - n, 0 }.Max() + e[n]
            : 99,
          b + 2 - z + n
        }.Min();
    for (int i = 1; i <= m; i++)
    {
      a[n] = i;
      int[] f = e.Clone() as int[];
      foreach (char c in ToS(i, b))
      {
        f[ToI(c, b)]++;
      }
      if (Range(0, n).Any(j => f[j] > a[j])) continue;
      x(b, a, n + 1, f, z + i);
    }
  }
}
static bool Eq(int[] a, int[] b)
{
  if (a == null || b == null) return (a == b);
  if (a.Length != b.Length) return false;
  for (int i = 0; i < a.Length; i++)
    if (a[i] != b[i]) return false;
  return true;
}
static string ToS(int i, int b)
{
  char[] c = ALNUM.ToCharArray();
  var sb = new StringBuilder();
  for (; i > 0; i /= b) sb.Insert(0, c[i % b]);
  return sb.Length > 0 ? sb.ToString() : "0";
}
static int ToI(char c, int b)
{
  return ALNUM.IndexOf(c);
}
static IEnumerable<int> Range(int s, int e)
{
  for (int i = s; i <= e; i++) yield return i;
}
