← Home
For problem statement at 1000-1999/1600-1699/1600-1609/1603/problemD.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1600-1609/1603/verifierD.go ends with case 4 failed: expected 0 got 96
input:
96 40
exit status 1 can you fix the verifier? package main

import (
	"io"
	"math/bits"
	"os"
	"strconv"
)

const INF int64 = 1 << 60

func nextInt(data []byte, idx *int) int {
	n := len(data)
	i := *idx
	for i < n && (data[i] < '0' || data[i] > '9') {
		i++
	}
	v := 0
	for i < n && data[i] >= '0' && data[i] <= '9' {
		v = v*10 + int(data[i]-'0')
		i++
	}
	*idx = i
	return v
}

func pointUpdate(sum, mn []int64, size, pos int, delta int64) {
	i := size + pos - 1
	sum[i] += delta
	mn[i] = sum[i]
	for i >>= 1; i > 0; i >>= 1 {
		ls := sum[i<<1]
		rs := sum[i<<1|1]
		sum[i] = ls + rs
		v := mn[i<<1]
		t := ls + mn[i<<1|1]
		if t < v {
			v = t
		}
		mn[i] = v
	}
}

func prefixMin(sum, mn []int64, size, r int) int64 {
	l := size
	rr := size + r
	lsum, lmn := int64(0), INF
	rsum, rmn := int64(0), INF
	for l < rr {
		if l&1 == 1 {
			t := lsum + mn[l]
			if t < lmn {
				lmn = t
			}
			lsum += sum[l]
			l++
		}
		if rr&1 == 1 {
			rr--
			t := sum[rr] + rmn
			if mn[rr] < t {
				rmn = mn[rr]
			} else {
				rmn = t
			}
			rsum += sum[rr]
		}
		l >>= 1
		rr >>= 1
	}
	t := lsum + rmn
	if t < lmn {
		return t
	}
	_ = rsum
	return lmn
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	t := nextInt(data, &idx)

	ns := make([]int, t)
	ks := make([]int, t)
	maxN, maxK := 0, 0
	for i := 0; i < t; i++ {
		n := nextInt(data, &idx)
		k := nextInt(data, &idx)
		ns[i] = n
		ks[i] = k
		if n > maxN {
			maxN = n
		}
		if k > maxK {
			maxK = k
		}
	}

	globalThreshold := bits.Len(uint(maxN))
	preK := globalThreshold - 1
	if preK > maxK {
		preK = maxK
	}

	var ans [][]int64
	if preK >= 1 {
		ans = make([][]int64, preK+1)

		prev := make([]int64, maxN+1)
		a1 := make([]int64, maxN+1)
		for n := 1; n <= maxN; n++ {
			v := int64(n) * int64(n+1) / 2
			prev[n] = v
			a1[n] = v
		}
		ans[1] = a1

		if preK >= 2 {
			phi := make([]int, maxN+1)
			for i := 0; i <= maxN; i++ {
				phi[i] = i
			}
			if maxN >= 1 {
				phi[1] = 1
			}
			for i := 2; i <= maxN; i++ {
				if phi[i] == i {
					for j := i; j <= maxN; j += i {
						phi[j] -= phi[j] / i
					}
				}
			}

			cnt := make([]int, maxN+1)
			for d := 1; d*2 <= maxN; d++ {
				for e := d * 2; e <= maxN; e += d {
					cnt[e]++
				}
			}
			divs := make([][]int, maxN+1)
			for e := 2; e <= maxN; e++ {
				if cnt[e] > 0 {
					divs[e] = make([]int, 0, cnt[e])
				}
			}
			for d := 1; d*2 <= maxN; d++ {
				for e := d * 2; e <= maxN; e += d {
					divs[e] = append(divs[e], d)
				}
			}

			size := 1
			for size < maxN {
				size <<= 1
			}
			sum := make([]int64, size<<1)
			mn := make([]int64, size<<1)

			for k := 2; k <= preK; k++ {
				for i := 1; i < size<<1; i++ {
					sum[i] = 0
					mn[i] = INF
				}

				prevB := int64(0)
				for l := 1; l <= maxN; l++ {
					var b int64
					if l < k {
						b = INF
					} else {
						b = prev[l-1] - int64(l) + 1
					}
					d := b - prevB
					p := size + l - 1
					sum[p] = d
					mn[p] = d
					prevB = b
				}

				for i := size - 1; i >= 1; i-- {
					ls := sum[i<<1]
					rs := sum[i<<1|1]
					sum[i] = ls + rs
					v := mn[i<<1]
					t := ls + mn[i<<1|1]
					if t < v {
						v = t
					}
					mn[i] = v
				}

				cur := make([]int64, maxN+1)
				for r := 1; r <= maxN; r++ {
					if r > 1 {
						pointUpdate(sum, mn, size, 1, int64(r-1))
					}
					for _, d := range divs[r] {
						w := int64(phi[r/d])
						pointUpdate(sum, mn, size, d+1, -w)
					}
					minv := prefixMin(sum, mn, size, r)
					if minv >= INF/2 {
						cur[r] = INF
					} else {
						cur[r] = int64(r) + minv
					}
				}

				ans[k] = cur
				prev = cur
			}
		}
	}

	out := make([]byte, 0, t*12)
	for i := 0; i < t; i++ {
		n, k := ns[i], ks[i]
		var v int64
		if k >= bits.Len(uint(n)) {
			v = int64(n)
		} else {
			v = ans[k][n]
		}
		out = strconv.AppendInt(out, v, 10)
		if i+1 < t {
			out = append(out, '\n')
		}
	}
	os.Stdout.Write(out)
}