← Home
For problem statement at 2000-2999/2000-2099/2030-2039/2039/problemF1.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2030-2039/2039/verifierF1.go ends with wrong answer on test 1 case 3
input m=9
reference: 157
candidate: 165
exit status 1 can you fix the verifier? package main

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

const MOD int64 = 998244353

func main() {
	data, _ := io.ReadAll(os.Stdin)
	p := 0
	nextInt := func() int {
		for p < len(data) && (data[p] < '0' || data[p] > '9') {
			p++
		}
		x := 0
		for p < len(data) && data[p] >= '0' && data[p] <= '9' {
			x = x*10 + int(data[p]-'0')
			p++
		}
		return x
	}

	t := nextInt()
	ms := make([]int, t)
	maxM := 0
	for i := 0; i < t; i++ {
		ms[i] = nextInt()
		if ms[i] > maxM {
			maxM = ms[i]
		}
	}

	mu := make([]int, maxM+1)
	if maxM >= 1 {
		mu[1] = 1
	}
	primes := make([]int, 0)
	comp := make([]bool, maxM+1)
	for i := 2; i <= maxM; i++ {
		if !comp[i] {
			primes = append(primes, i)
			mu[i] = -1
		}
		for _, pr := range primes {
			v := i * pr
			if v > maxM {
				break
			}
			comp[v] = true
			if i%pr == 0 {
				mu[v] = 0
				break
			} else {
				mu[v] = -mu[i]
			}
		}
	}

	divs := make([][]int, maxM+1)
	for d := 1; d <= maxM; d++ {
		for x := d; x <= maxM; x += d {
			divs[x] = append(divs[x], d)
		}
	}

	C := make([]int64, maxM+1)
	Msum := make([]int64, maxM+1)

	out := make([]byte, 0, t*16)

	for _, m := range ms {
		for i := 1; i <= m; i++ {
			C[i] = 0
			Msum[i] = 0
		}

		var ans int64 = 0
		var tmp [256]int64

		for u := m; u >= 1; u-- {
			du := divs[u]

			for i, g := range du {
				r := u / g
				var total int64 = 0
				for _, d := range divs[r] {
					if mu[d] == 1 {
						total += Msum[g*d]
					} else if mu[d] == -1 {
						total -= Msum[g*d]
					}
				}
				total -= C[g]
				total %= MOD
				if total < 0 {
					total += MOD
				}
				val := (2 * total) % MOD
				if g == u {
					val++
					if val >= MOD {
						val -= MOD
					}
				}
				tmp[i] = val
			}

			for i, g := range du {
				val := tmp[i]
				if val == 0 {
					continue
				}
				C[g] += val
				if C[g] >= MOD {
					C[g] -= MOD
				}
				ans += val
				if ans >= MOD {
					ans -= MOD
				}
				for _, d := range divs[g] {
					Msum[d] += val
					if Msum[d] >= MOD {
						Msum[d] -= MOD
					}
				}
			}
		}

		out = strconv.AppendInt(out, ans, 10)
		out = append(out, '\n')
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out)
	w.Flush()
}