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)
}