← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func gcd(a, b int) int {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	if _, err := fmt.Fscan(reader, &n); err != nil {
		return
	}

	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	g := 0
	if n > 0 {
		g = a[0]
		for i := 1; i < n; i++ {
			g = gcd(g, a[i])
		}
	}

	maxCuts := 0
	bestK := 0

	for k := 1; k*k <= g; k++ {
		if g%k == 0 {
			divisors := []int{k}
			if k*k != g {
				divisors = append(divisors, g/k)
			}

			for _, d := range divisors {
				odds := 0
				for _, val := range a {
					if (val/d)%2 != 0 {
						odds++
					}
				}

				if odds <= 1 {
					currentCuts := d
					if odds == 0 {
						currentCuts = d * 2
					}
					if currentCuts > maxCuts {
						maxCuts = currentCuts
						bestK = d
					}
				}
			}
		}
	}

	fmt.Fprintln(writer, maxCuts)
	if maxCuts == 0 {
		for i, count := range a {
			for j := 0; j < count; j++ {
				writer.WriteByte(byte('a' + i))
			}
		}
		writer.WriteByte('\n')
	} else {
		b := make([]int, n)
		oddIdx := -1
		for i := 0; i < n; i++ {
			b[i] = a[i] / bestK
			if b[i]%2 != 0 {
				oddIdx = i
			}
		}

		var half []byte
		for i := 0; i < n; i++ {
			cnt := b[i] / 2
			for j := 0; j < cnt; j++ {
				half = append(half, byte('a'+i))
			}
		}

		var block []byte
		block = append(block, half...)
		if oddIdx != -1 {
			block = append(block, byte('a'+oddIdx))
		}
		for i := len(half) - 1; i >= 0; i-- {
			block = append(block, half[i])
		}

		for i := 0; i < bestK; i++ {
			writer.Write(block)
		}
		writer.WriteByte('\n')
	}
}