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 } best := 99999 for x := 0; x < 1e4; x++ { xb := 0 for t:=x; t > 0; t /= 10 { xb |= 1 << (t % 10) } if (xb&b) != xb { continue } if OnesCount(uint(xb))*2 != OnesCount(uint(b)) { continue } for y := 0; y < 1e4; y++ { yb := 0 for t := y; t > 0; t /= 10 { yb |= 1 << (t % 10) } if (xb|yb) != b { continue } if x > y { best = min(best, x - y) } else { best = min(best, y - x) } } } Println(best) }