← Home
package main

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

const MOD int64 = 1000000007

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

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

	ans := make([]int64, maxN+1)

	if maxN >= 2 {
		comp := make([]bool, maxN+1)
		primes := make([]int, 0, 80000)
		for i := 2; i <= maxN; i++ {
			if !comp[i] {
				primes = append(primes, i)
			}
			for _, p := range primes {
				if i*p > maxN {
					break
				}
				comp[i*p] = true
				if i%p == 0 {
					break
				}
			}
		}

		diff := make([]int64, maxN+3)

		for _, p := range primes {
			limit := maxN / p
			for q := 1; q <= limit; q++ {
				rem := q % p
				if rem == 0 {
					continue
				}
				v := p - rem
				l := q * p
				r := l + p - 1
				if r > maxN {
					r = maxN
				}
				diff[l] += int64(v)
				diff[r+1] -= int64(v)
			}
		}

		for q := 1; q*4 <= maxN; q += 2 {
			l := q * 4
			r := l + 3
			if r > maxN {
				r = maxN
			}
			diff[l] += 2
			diff[r+1] -= 2
		}

		var cur, total int64
		for i := 1; i <= maxN; i++ {
			cur += diff[i]
			total += cur
			ans[i] = total % MOD
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	for _, n := range qs {
		out.WriteString(strconv.FormatInt(ans[n], 10))
		out.WriteByte('\n')
	}
	out.Flush()
}