← Home
For problem statement at 2000-2999/2100-2199/2130-2139/2132/problemD.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2130-2139/2132/verifierD.go ends with mismatch at test 7: expected 4441049382716054, got 388206101142
exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

func sumDigitsUpTo(n int64) int64 {
	if n <= 0 {
		return 0
	}

	var dfs func(pos int, tight bool, started bool, sum int) int64
	digits := make([]int, 0, 19)
	{
		x := n
		for x > 0 {
			digits = append(digits, int(x%10))
			x /= 10
		}
		for i, j := 0, len(digits)-1; i < j; i, j = i+1, j-1 {
			digits[i], digits[j] = digits[j], digits[i]
		}
	}

	mem := make([][]int64, len(digits)+1)
	for i := range mem {
		mem[i] = make([]int64, 2*9*19+1)
		for j := range mem[i] {
			mem[i][j] = -1
		}
	}

	var dp func(idx int, tight bool, started bool, sum int) (int64, int64)
	dp = func(idx int, tight bool, started bool, sum int) (int64, int64) {
		if idx == len(digits) {
			if started {
				return 1, int64(sum)
			}
			return 0, 0
		}
		if !tight {
			key := sum
			if started {
				key += 9 * 19
			}
			if mem[idx][key] != -1 {
				cnt := mem[idx][key] >> 32
				su := int64(uint64(mem[idx][key]) & ((1 << 32) - 1))
				if su&(1<<31) != 0 {
					su = su - (1 << 32)
				}
				return cnt, su
			}
		}

		limit := 9
		if tight {
			limit = digits[idx]
		}
		var cntTotal int64
		var sumTotal int64
		for dig := 0; dig <= limit; dig++ {
			ntight := tight && (dig == limit)
			nstarted := started || dig != 0
			add := 0
			if nstarted {
				add = dig
			}
			cnt, su := dp(idx+1, ntight, nstarted, sum+add)
			cntTotal += cnt
			sumTotal += su
		}

		if !tight {
			key := sum
			if started {
				key += 9 * 19
			}
			cnt := cntTotal
			su := sumTotal
			lo := int64(uint32(su))
			mem[idx][key] = (cnt << 32) | lo
		}

		return cntTotal, sumTotal
	}

	_ = dfs
	_, res := dp(0, true, false, 0)
	return res
}

func sumDigitsRange(l, r int64) int64 {
	if r < l {
		return 0
	}
	return sumDigitsUpTo(r) - sumDigitsUpTo(l-1)
}

func pow10i(d int) int64 {
	res := int64(1)
	for i := 0; i < d; i++ {
		res *= 10
	}
	return res
}

func blockDigitsSum(d int64) int64 {
	if d <= 0 {
		return 0
	}
	D := int(d)
	a := pow10i(D - 1)
	b := pow10i(D) - 1
	return sumDigitsRange(a, b)
}

func solveK(k int64) int64 {
	var ans int64
	var d int64 = 1
	for {
		a := pow10i(int(d - 1))
		b := pow10i(int(d)) - 1
		cnt := b - a + 1
		totalDigits := cnt * d
		if k >= totalDigits {
			ans += blockDigitsSum(d)
			k -= totalDigits
			d++
			continue
		}
		fullNums := k / d
		rem := k % d
		if fullNums > 0 {
			last := a + fullNums - 1
			ans += sumDigitsRange(a, last)
		}
		if rem > 0 {
			x := a + fullNums
			s := fmt.Sprintf("%d", x)
			for i := int64(0); i < rem; i++ {
				ans += int64(s[i] - '0')
			}
		}
		break
	}
	return ans
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var t int
	fmt.Fscan(in, &t)
	for ; t > 0; t-- {
		var k int64
		fmt.Fscan(in, &k)
		fmt.Fprintln(out, solveK(k))
	}
}
```