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

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	// Buffer size sufficient for inputs
	buf := make([]byte, 2048)
	scanner.Buffer(buf, 2048)

	if !scanner.Scan() {
		return
	}
	nLine := scanner.Text()
	n, _ := strconv.ParseUint(nLine, 10, 64)

	if !scanner.Scan() {
		return
	}
	k := scanner.Text()

	L := len(k)

	// dp[i] stores the best {count, value} for suffix k[i:]
	// We prioritize minimizing count (number of base-n digits), then value.
	type State struct {
		cnt int
		val uint64
	}

	infVal := uint64(math.MaxUint64)
	infCnt := L + 5 // Larger than any possible count

	dp := make([]State, L+1)
	for i := 0; i < L; i++ {
		dp[i] = State{cnt: infCnt, val: infVal}
	}
	dp[L] = State{cnt: 0, val: 0}

	// Precompute powers of n. Saturate at MaxUint64 on overflow.
	powers := make([]uint64, L+1)
	powers[0] = 1
	for i := 1; i <= L; i++ {
		p, overflow := safeMul(powers[i-1], n)
		if overflow {
			for j := i; j <= L; j++ {
				powers[j] = infVal
			}
			break
		}
		powers[i] = p
	}

	for i := L - 1; i >= 0; i-- {
		currentVal := uint64(0)
		// Try forming a digit from k[i:j]
		for j := i + 1; j <= L; j++ {
			digit := uint64(k[j-1] - '0')

			// Check for leading zero rule: a part cannot start with '0' unless it is "0"
			if k[i] == '0' && j-i > 1 {
				break
			}

			// Check for overflow when parsing decimal
			if currentVal > (math.MaxUint64-digit)/10 {
				break
			}
			currentVal = currentVal*10 + digit

			// The digit value must be strictly less than n
			if currentVal >= n {
				break
			}

			// If the remaining suffix is valid
			if dp[j].cnt != infCnt {
				c := dp[j].cnt
				rem := dp[j].val

				// Calculate contribution: currentVal * n^c + remainder
				var pow uint64
				if c < len(powers) {
					pow = powers[c]
				} else {
					pow = infVal
				}

				term, ov1 := safeMul(currentVal, pow)
				total, ov2 := safeAdd(term, rem)

				if !ov1 && !ov2 {
					newCnt := c + 1
					// Relaxation
					if newCnt < dp[i].cnt {
						dp[i] = State{cnt: newCnt, val: total}
					} else if newCnt == dp[i].cnt {
						if total < dp[i].val {
							dp[i] = State{cnt: newCnt, val: total}
						}
					}
				}
			}
		}
	}

	fmt.Println(dp[0].val)
}

func safeMul(a, b uint64) (uint64, bool) {
	if a == 0 || b == 0 {
		return 0, false
	}
	res := a * b
	if res/b != a {
		return math.MaxUint64, true
	}
	return res, false
}

func safeAdd(a, b uint64) (uint64, bool) {
	res := a + b
	if res < a {
		return math.MaxUint64, true
	}
	return res, false
}
```