← Home
For problem statement at 0-999/0-99/50-59/55/problemD.txt this is a correct solution, but verifier at 0-999/0-99/50-59/55/verifierD.go ends with All tests passed can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

const MOD = 2520

var (
	lcmList  []int
	lcmToIdx map[int]int
	memo     [20][MOD][50]int64
	digits   []int
)

func init() {
	lcmSet := make(map[int]bool)
	var gen func(int, int)
	gen = func(idx, cur int) {
		if idx > 9 {
			lcmSet[cur] = true
			return
		}
		gen(idx+1, cur)
		gen(idx+1, lcm(cur, idx))
	}
	gen(1, 1)
	lcmList = make([]int, 0, len(lcmSet))
	for k := range lcmSet {
		lcmList = append(lcmList, k)
	}
	sort.Ints(lcmList)
	lcmToIdx = make(map[int]int)
	for i, v := range lcmList {
		lcmToIdx[v] = i
	}
}

func gcd(a, b int) int {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

func lcm(a, b int) int {
	return a / gcd(a, b) * b
}

func solve(n int64) int64 {
	if n <= 0 {
		return 0
	}
	s := strconv.FormatInt(n, 10)
	digits = make([]int, len(s))
	for i, ch := range s {
		digits[i] = int(ch - '0')
	}
	for i := range memo {
		for j := range memo[i] {
			for k := range memo[i][j] {
				memo[i][j][k] = -1
			}
		}
	}
	return dfs(0, 0, lcmToIdx[1], true, false)
}

func dfs(pos, rem, lcmIdx int, tight, started bool) int64 {
	if pos == len(digits) {
		if started && rem%lcmList[lcmIdx] == 0 {
			return 1
		}
		return 0
	}
	if !tight && started {
		if val := memo[pos][rem][lcmIdx]; val != -1 {
			return val
		}
	}
	limit := 9
	if tight {
		limit = digits[pos]
	}
	var res int64
	for d := 0; d <= limit; d++ {
		newTight := tight && (d == limit)
		if !started && d == 0 {
			res += dfs(pos+1, 0, lcmToIdx[1], newTight, false)
		} else {
			newRem := (rem*10 + d) % MOD
			newLcmIdx := lcmIdx
			if d != 0 {
				if !started {
					newLcmIdx = lcmToIdx[d]
				} else {
					newLcmIdx = lcmToIdx[lcm(lcmList[lcmIdx], d)]
				}
			}
			res += dfs(pos+1, newRem, newLcmIdx, newTight, true)
		}
	}
	if !tight && started {
		memo[pos][rem][lcmIdx] = res
	}
	return res
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	scanner.Scan()
	t, _ := strconv.Atoi(scanner.Text())
	for i := 0; i < t; i++ {
		scanner.Scan()
		l, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		scanner.Scan()
		r, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		fmt.Println(solve(r) - solve(l-1))
	}
}
```