← Home
```go
package main

import (
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"
)

func eval_split(S string, mask int) (int, string) {
	sum := 0
	expr := ""
	current := 0
	for i := 0; i < len(S); i++ {
		current = current*10 + int(S[i]-'0')
		expr += string(S[i])
		if i == len(S)-1 || (mask&(1<<i)) != 0 {
			sum += current
			if i != len(S)-1 {
				expr += "+"
			}
			current = 0
		}
	}
	return sum, expr
}

func is_good(V1 int) (bool, string, string) {
	S1 := strconv.Itoa(V1)
	n1 := len(S1)
	for m1 := 0; m1 < (1<<(n1-1)); m1++ {
		V2, expr1 := eval_split(S1, m1)
		S2 := strconv.Itoa(V2)
		n2 := len(S2)
		for m2 := 0; m2 < (1<<(n2-1)); m2++ {
			V3, expr2 := eval_split(S2, m2)
			if V3 <= 9 {
				return true, expr1, expr2
			}
		}
	}
	return false, "", ""
}

func build_expr(S string, start int, L int) string {
	var sb strings.Builder
	for i := 0; i < len(S); i++ {
		if start != -1 && i == start {
			sb.WriteString(S[i : i+L])
			i += L - 1
		} else {
			sb.WriteByte(S[i])
		}
		if i != len(S)-1 {
			sb.WriteByte('+')
		}
	}
	return sb.String()
}

func build_expr_2(S string, i1, L1, i2, L2 int) string {
	var sb strings.Builder
	for i := 0; i < len(S); i++ {
		if i == i1 {
			sb.WriteString(S[i : i+L1])
			i += L1 - 1
		} else if i == i2 {
			sb.WriteString(S[i : i+L2])
			i += L2 - 1
		} else {
			sb.WriteByte(S[i])
		}
		if i != len(S)-1 {
			sb.WriteByte('+')
		}
	}
	return sb.String()
}

func main() {
	bytes, err := io.ReadAll(os.Stdin)
	if err != nil {
		return
	}
	fields := strings.Fields(string(bytes))
	if len(fields) < 2 {
		return
	}
	S := fields[1]

	M := 0
	for i := 0; i < len(S); i++ {
		M += int(S[i] - '0')
	}

	visited := make(map[int]bool)
	visited[M] = true

	if ok, expr1, expr2 := is_good(M); ok {
		fmt.Println(build_expr(S, -1, 1))
		fmt.Println(expr1)
		fmt.Println(expr2)
		return
	}

	for L := 2; L <= 7; L++ {
		for i := 0; i <= len(S)-L; i++ {
			sub_sum := 0
			for j := 0; j < L; j++ {
				sub_sum += int(S[i+j] - '0')
			}
			val, _ := strconv.Atoi(S[i : i+L])
			V1_new := M - sub_sum + val

			if visited[V1_new] {
				continue
			}
			visited[V1_new] = true

			if ok, expr1, expr2 := is_good(V1_new); ok {
				fmt.Println(build_expr(S, i, L))
				fmt.Println(expr1)
				fmt.Println(expr2)
				return
			}
		}
	}

	iters := 0
	for i := 0; i <= len(S)-4; i++ {
		if S[i] == '0' {
			continue
		}
		for j := i + 2; j <= len(S)-2; j++ {
			iters++
			if iters > 10000 {
				return
			}
			sub_sum := int(S[i]-'0') + int(S[i+1]-'0') + int(S[j]-'0') + int(S[j+1]-'0')
			val1, _ := strconv.Atoi(S[i : i+2])
			val2, _ := strconv.Atoi(S[j : j+2])
			V1_new := M - sub_sum + val1 + val2

			if visited[V1_new] {
				continue
			}
			visited[V1_new] = true

			if ok, expr1, expr2 := is_good(V1_new); ok {
				fmt.Println(build_expr_2(S, i, 2, j, 2))
				fmt.Println(expr1)
				fmt.Println(expr2)
				return
			}
		}
	}
}
```