← Home
package main

import (
	"io"
	"os"
	"strconv"
)

type Precomp struct {
	free [][]uint64
	cum  []uint64
}

func countUpTo(n uint64, b int, pc *Precomp) uint64 {
	if n == 0 {
		return 0
	}
	var digits [64]int
	m := 0
	base := uint64(b)
	for n > 0 {
		digits[m] = int(n % base)
		n /= base
		m++
	}
	ans := pc.cum[m-1]
	mask := 0
	for pos := m - 1; pos >= 0; pos-- {
		cur := digits[pos]
		start := 0
		if pos == m-1 {
			start = 1
		}
		for d := start; d < cur; d++ {
			ans += pc.free[pos][mask^(1<<d)]
		}
		mask ^= 1 << cur
	}
	if mask == 0 {
		ans++
	}
	return ans
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextUint := func() uint64 {
		for idx < len(data) && data[idx] <= ' ' {
			idx++
		}
		var v uint64
		for idx < len(data) && data[idx] > ' ' {
			v = v*10 + uint64(data[idx]-'0')
			idx++
		}
		return v
	}

	const maxN uint64 = 1000000000000000000

	var pcs [11]Precomp
	for b := 2; b <= 10; b++ {
		digits := 0
		for x := maxN; x > 0; x /= uint64(b) {
			digits++
		}
		states := 1 << b
		free := make([][]uint64, digits+1)
		for i := 0; i <= digits; i++ {
			free[i] = make([]uint64, states)
		}
		free[0][0] = 1
		for l := 0; l < digits; l++ {
			cur := free[l]
			nxt := free[l+1]
			for mask, val := range cur {
				if val == 0 {
					continue
				}
				for d := 0; d < b; d++ {
					nxt[mask^(1<<d)] += val
				}
			}
		}
		cum := make([]uint64, digits+1)
		for l := 1; l <= digits; l++ {
			var cnt uint64
			for d := 1; d < b; d++ {
				cnt += free[l-1][1<<d]
			}
			cum[l] = cum[l-1] + cnt
		}
		pcs[b] = Precomp{free: free, cum: cum}
	}

	q := int(nextUint())
	out := make([]byte, 0, q*24)
	for i := 0; i < q; i++ {
		b := int(nextUint())
		l := nextUint()
		r := nextUint()
		ans := countUpTo(r, b, &pcs[b]) - countUpTo(l-1, b, &pcs[b])
		out = strconv.AppendUint(out, ans, 10)
		out = append(out, '\n')
	}
	os.Stdout.Write(out)
}