← Home
```go
package main

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

const MOD = 998244353
const MAXM = 100005

var primes []int
var isPrime [MAXM]bool
var mu [MAXM]int
var divs [MAXM][]int

func precompute() {
	for i := 2; i < MAXM; i++ {
		isPrime[i] = true
	}
	mu[1] = 1
	for i := 2; i < MAXM; i++ {
		if isPrime[i] {
			primes = append(primes, i)
			mu[i] = -1
		}
		for _, p := range primes {
			if i*p >= MAXM {
				break
			}
			isPrime[i*p] = false
			if i%p == 0 {
				mu[i*p] = 0
				break
			} else {
				mu[i*p] = -mu[i]
			}
		}
	}
	for i := 1; i < MAXM; i++ {
		for j := i; j < MAXM; j += i {
			divs[j] = append(divs[j], i)
		}
	}
}

var DP [MAXM]int
var T [MAXM]int
var add_to_DP [MAXM]int
var S [MAXM]int

func main() {
	precompute()

	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var t int
	if _, err := fmt.Fscan(reader, &t); err != nil {
		return
	}

	for i := 0; i < t; i++ {
		var m int
		fmt.Fscan(reader, &m)

		Ans := 0

		for y := m; y >= 1; y-- {
			D := divs[y]

			for _, gp := range D {
				sum := 0
				k := y / gp
				for _, d := range divs[k] {
					if mu[d] == 1 {
						x := d * gp
						sum += T[x]
						if sum >= MOD {
							sum -= MOD
						}
					} else if mu[d] == -1 {
						x := d * gp
						sum -= T[x]
						if sum < 0 {
							sum += MOD
						}
					}
				}
				S[gp] = sum
			}

			for _, gp := range D {
				delta := S[gp] - DP[gp]
				if delta < 0 {
					delta += MOD
				}
				add_to_DP[gp] = (2 * delta) % MOD
			}

			add_to_DP[y] += 1
			if add_to_DP[y] >= MOD {
				add_to_DP[y] -= MOD
			}

			for _, gp := range D {
				if add_to_DP[gp] > 0 {
					val := add_to_DP[gp]
					Ans += val
					if Ans >= MOD {
						Ans -= MOD
					}
					DP[gp] += val
					if DP[gp] >= MOD {
						DP[gp] -= MOD
					}

					for _, x := range divs[gp] {
						T[x] += val
						if T[x] >= MOD {
							T[x] -= MOD
						}
					}
					add_to_DP[gp] = 0
				}
			}
		}

		fmt.Fprintln(writer, Ans)

		for j := 1; j <= m; j++ {
			DP[j] = 0
			T[j] = 0
		}
	}
}
```