← Home
For problem statement at 0-999/800-899/830-839/833/problemC.txt this is a correct solution, but verifier at 0-999/800-899/830-839/833/verifierC.go ends with All tests passed can you fix the verifier? package main

import (
	"fmt"
)

var R_arr [18]int
var L, R_val int64
var ans int64
var counts [10]int

func getMax(C *[10]int, R *[18]int) int64 {
	rem := *C
	matchLen := 0
	for i := 0; i < 18; i++ {
		if rem[R[i]] > 0 {
			rem[R[i]]--
			matchLen++
		} else {
			break
		}
	}

	if matchLen == 18 {
		var val int64 = 0
		for i := 0; i < 18; i++ {
			val = val*10 + int64(R[i])
		}
		return val
	}

	for div := matchLen; div >= 0; div-- {
		r := *C
		for i := 0; i < div; i++ {
			r[R[i]]--
		}

		best_d := -1
		for d := R[div] - 1; d >= 0; d-- {
			if r[d] > 0 {
				best_d = d
				break
			}
		}

		if best_d != -1 {
			var val int64 = 0
			for i := 0; i < div; i++ {
				val = val*10 + int64(R[i])
			}
			val = val*10 + int64(best_d)
			r[best_d]--
			for d := 9; d >= 0; d-- {
				for r[d] > 0 {
					val = val*10 + int64(d)
					r[d]--
				}
			}
			return val
		}
	}
	return -1
}

func generate(digit int, currentSize int, minVal int64) {
	if minVal > R_val {
		return
	}
	if digit == 10 {
		if currentSize > 0 {
			var fullCounts [10]int
			copy(fullCounts[1:], counts[1:])
			fullCounts[0] = 18 - currentSize

			maxVal := getMax(&fullCounts, &R_arr)
			if maxVal >= L {
				ans++
			}
		}
		return
	}

	maxPick := 18 - currentSize

	generate(digit+1, currentSize, minVal)

	currMinVal := minVal
	for i := 1; i <= maxPick; i++ {
		currMinVal = currMinVal*10 + int64(digit)
		if currMinVal > R_val {
			break
		}
		counts[digit] = i
		generate(digit+1, currentSize+i, currMinVal)
	}
	counts[digit] = 0
}

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

	if R_input == 1000000000000000000 {
		R_val = 999999999999999999
		if L > 100000000000000000 {
			ans++
		}
	} else {
		R_val = R_input
	}

	temp := R_val
	for i := 17; i >= 0; i-- {
		R_arr[i] = int(temp % 10)
		temp /= 10
	}

	generate(1, 0, 0)

	fmt.Println(ans)
}