← Home
For problem statement at 0-999/900-999/990-999/991/problemF.txt this is a correct solution, but verifier at 0-999/900-999/990-999/991/verifierF.go ends with  can you fix the verifier? ```go
package main

import (
	"fmt"
	"math"
	"sort"
	"strconv"
)

type Element struct {
	val int64
	str string
}

var CTs map[int64]string

func add_CT(val int64, s string) {
	if val > 10000000000 {
		return
	}
	valStrLen := len(strconv.FormatInt(val, 10))
	if len(s) >= valStrLen {
		return
	}
	if existing, ok := CTs[val]; !ok || len(s) < len(existing) {
		CTs[val] = s
	}
}

func main() {
	var n int64
	if _, err := fmt.Scan(&n); err != nil {
		return
	}

	CTs = make(map[int64]string)
	var SCPs []Element

	for Y := 2; Y <= 34; Y++ {
		for X := int64(2); ; X++ {
			valFloat := math.Pow(float64(X), float64(Y))
			if valFloat > 10000000000.5 {
				break
			}

			exact := int64(1)
			for i := 0; i < Y; i++ {
				exact *= X
			}
			if exact > 10000000000 {
				break
			}

			s := strconv.FormatInt(X, 10) + "^" + strconv.Itoa(Y)
			valStrLen := len(strconv.FormatInt(exact, 10))
			if len(s) < valStrLen {
				SCPs = append(SCPs, Element{exact, s})
			}
		}
	}

	sort.Slice(SCPs, func(i, j int) bool {
		return SCPs[i].val < SCPs[j].val
	})

	for _, p := range SCPs {
		add_CT(p.val, p.str)
	}

	for i := 0; i < len(SCPs); i++ {
		for j := i; j < len(SCPs); j++ {
			if SCPs[i].val > 10000000000/SCPs[j].val {
				break
			}
			val := SCPs[i].val * SCPs[j].val
			add_CT(val, SCPs[i].str+"*"+SCPs[j].str)
			add_CT(val, SCPs[j].str+"*"+SCPs[i].str)
		}
	}

	for _, p := range SCPs {
		limit := 10000000000 / p.val
		if limit < 2 {
			continue
		}

		max_len := 10 - len(p.str) - 1
		if max_len < 1 {
			continue
		}

		max_N := int64(math.Pow(10, float64(max_len))) - 1
		if max_N > limit {
			max_N = limit
		}

		for N := int64(2); N <= max_N; N++ {
			val := N * p.val
			nStr := strconv.FormatInt(N, 10)
			add_CT(val, p.str+"*"+nStr)
			add_CT(val, nStr+"*"+p.str)
		}
	}

	best := strconv.FormatInt(n, 10)

	if s, ok := CTs[n]; ok {
		if len(s) < len(best) {
			best = s
		}
	}

	for ct_val, ct_str := range CTs {
		if ct_val >= n {
			continue
		}
		rem := n - ct_val
		remStr := strconv.FormatInt(rem, 10)

		cand1 := ct_str + "+" + remStr
		if len(cand1) < len(best) {
			best = cand1
		}
		cand2 := remStr + "+" + ct_str
		if len(cand2) < len(best) {
			best = cand2
		}

		if rem_str, ok := CTs[rem]; ok {
			cand3 := ct_str + "+" + rem_str
			if len(cand3) < len(best) {
				best = cand3
			}
		}
	}

	fmt.Println(best)
}
```