package main import . "fmt" import . "os" import bf "bufio" import sl "slices" import . "math/bits" func main() { rd := bf.NewReader(Stdin) var n int Fscan(rd, &n) const M = 998244353 // nが奇数ならソートして真ん中あたりで分割? // 1 2 3 4 4 5 6 7 8 8 9 // -> 1 2 3 4 4 5 // -> 9 8 8 7 6 if n % 2 == 1 { c := make([]int, n) for i := range c { Fscan(rd, &c[i]) } sl.Sort(c) x, y := c[0], 0 for i := 0; i < n/2 ; i++ { x = (x * 10 + c[i+1]) % M y = (y * 10 + c[n-1-i]) % M } println(x) println(y) Println((x-y+M)%M) return } // nが偶数なら重複する数字は上位桁で相殺すればよく // 相殺すると合計8個以下の偶数個数で相異なる数字が1個ずつ残る // XとYは同じ桁の数で最大のときでも4桁 // Xになりうるものを全探索し、Xになりうるもに対応するYを全探索で間に合いそう…? d := make([]int, 10) for i := 0; i < n; i++ { var v int Fscan(rd, &v) d[v]++ } b := 0 for i, v := range d { b |= ((v % 2) << i) } if b == 0 { Println(0) return } w := []int{} wb := []int{} for x := 0; x < 1e4; x++ { xb := 0 for t:=x; t > 0; t /= 10 { e := 1 << (t % 10) if (xb&e) != 0 { xb = 0 break } xb |= e } if (xb&b) != xb { continue } if OnesCount(uint(xb))*2 != OnesCount(uint(b)) { continue } w = append(w, x) wb = append(wb, xb) } best := 99999 for i, x := range w { for j, y := range w[i+1:] { if (wb[i]|wb[i+1+j]) != b { continue } best = min(best, max(x - y, y - x)) } } // 重複を1対だけ残して最小差分になることあるのか…? // 差が1になる組を最上位桁にして残りの下位桁を最小と最大 // 例えば // 1 2 3 3 3 5 6 7 8 9 // を // -> 3 1 3 3 5 // -> 2 9 8 7 6 // や // -> 6 1 2 3 3 // -> 5 9 8 7 3 // や // -> 7 1 2 3 3 // -> 6 9 8 5 3 // とかの組み合わせを試す・・・? for i, v := range d { if v < 2 { continue } r := []int{i, i} for j, t := range d { if t % 2 == 1 { r = append(r, j) } } sl.Sort(r) for p, rq := range r[1:] { if rq - r[p] != 1 { continue } u := []int{} for k, z := range r { if k != p && k != p+1 { u = append(u, z) } } x, y := rq, r[p] for f := 0; f < len(u)/2; f++ { x = x*10 + u[f] y = y*10 + u[len(u)-1-f] } best = min(best, max(x - y, y - x)) } } Println(best) }