← 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? ```go
package main

import (
	"fmt"
)

var L, R uint64
var L_str []byte
var L_req_T [20][9]byte
var L_req_Z [20]int
var L_prefix_val [20]uint64
var L_req_T_packed [20]uint64
var borrow_mask uint64

var ans uint64

func smallest_num(T *[9]byte, C int, K int) uint64 {
	if K > 18 {
		if K == 19 && C == 1 && T[0] == 1 {
			return 1000000000000000000
		}
		return R + 1
	}

	first_d := byte(0)
	for d := byte(0); d < 9; d++ {
		if T[d] > 0 {
			first_d = d
			break
		}
	}
	var res uint64 = uint64(first_d + 1)

	Z_total := K - C
	for k := 0; k < Z_total; k++ {
		res = res * 10
	}

	for d := byte(0); d < 9; d++ {
		rem := T[d]
		if d == first_d {
			rem--
		}
		for k := byte(0); k < rem; k++ {
			res = res*10 + uint64(d+1)
		}
	}
	return res
}

func min_X_ge_L(T *[9]byte, C int, T_packed uint64) uint64 {
	Len := C
	nL := len(L_str)
	if nL > Len {
		Len = nL
	}

	if Len > nL {
		return smallest_num(T, C, Len)
	}

	Z_total := Len - C
	for i := Len; i >= 0; i-- {
		if i == Len {
			if Z_total == L_req_Z[i] && T_packed == L_req_T_packed[i] {
				return L
			}
			continue
		}

		req_Z := L_req_Z[i]
		if Z_total < req_Z {
			continue
		}
		if (T_packed-L_req_T_packed[i])&borrow_mask != 0 {
			continue
		}

		best_d := -1
		for d := L_str[i] + 1; d <= 9; d++ {
			if T[d-1] > L_req_T[i][d-1] {
				best_d = int(d)
				break
			}
		}

		if best_d != -1 {
			var res uint64 = L_prefix_val[i]
			res = res*10 + uint64(best_d)
			Z_prime := Z_total - req_Z
			for k := 0; k < Z_prime; k++ {
				res = res * 10
			}
			for d := 0; d < 9; d++ {
				rem := T[d] - L_req_T[i][d]
				if d == best_d-1 {
					rem--
				}
				for k := byte(0); k < rem; k++ {
					res = res*10 + uint64(d+1)
				}
			}
			return res
		}
	}

	return smallest_num(T, C, Len+1)
}

func generate_tails(d byte, current_len int, current_T *[9]byte, T_packed uint64) {
	if current_len > 0 {
		if min_X_ge_L(current_T, current_len, T_packed) <= R {
			ans++
		}
	}
	if current_len == 18 {
		return
	}
	for i := d; i < 9; i++ {
		current_T[i]++
		generate_tails(i, current_len+1, current_T, T_packed+(1<<(uint(i)*7)))
		current_T[i]--
	}
}

func main() {
	for i := 0; i < 9; i++ {
		borrow_mask |= (1 << (uint(i)*7 + 6))
	}

	_, err := fmt.Scan(&L, &R)
	if err != nil {
		return
	}

	var temp uint64 = L
	if temp == 0 {
		L_str = append(L_str, 0)
	} else {
		for temp > 0 {
			L_str = append(L_str, byte(temp%10))
			temp /= 10
		}
	}
	for i, j := 0, len(L_str)-1; i < j; i, j = i+1, j-1 {
		L_str[i], L_str[j] = L_str[j], L_str[i]
	}

	L_prefix_val[0] = 0
	for i := 1; i <= len(L_str); i++ {
		L_prefix_val[i] = L_prefix_val[i-1]*10 + uint64(L_str[i-1])
		L_req_T[i] = L_req_T[i-1]
		L_req_Z[i] = L_req_Z[i-1]
		L_req_T_packed[i] = L_req_T_packed[i-1]

		if L_str[i-1] == 0 {
			L_req_Z[i]++
		} else {
			d := L_str[i-1] - 1
			L_req_T[i][d]++
			L_req_T_packed[i] += 1 << (uint(d) * 7)
		}
	}

	var start_T [9]byte
	generate_tails(0, 0, &start_T, 0)

	fmt.Println(ans)
}
```