← Home
```go
package main

import (
	"io"
	"os"
)

func sieve(m int) []int {
	spf := make([]int, m+1)
	primes := make([]int, 0, m/10)
	for i := 2; i <= m; i++ {
		if spf[i] == 0 {
			spf[i] = i
			primes = append(primes, i)
		}
		for j := 0; j < len(primes); j++ {
			p := primes[j]
			v := p * i
			if v > m || p > spf[i] {
				break
			}
			spf[v] = p
		}
	}
	return spf
}

func maxDivLE(x, k int, spf []int) int {
	if k < 2 || x < 4 {
		return 1
	}
	if x%k == 0 {
		return k
	}
	p := spf[x]
	if p == x {
		return 1
	}
	d := x / p
	if d <= k {
		return d
	}
	var primes [16]int
	var exps [16]int
	cnt := 0
	t := x
	for t > 1 {
		p = spf[t]
		e := 0
		for t%p == 0 {
			t /= p
			e++
		}
		primes[cnt] = p
		exps[cnt] = e
		cnt++
	}
	var divs [512]int
	divs[0] = 1
	dcnt := 1
	for i := 0; i < cnt; i++ {
		old := dcnt
		mul := 1
		p = primes[i]
		for e := 0; e < exps[i]; e++ {
			mul *= p
			for j := 0; j < old; j++ {
				divs[dcnt] = divs[j] * mul
				dcnt++
			}
		}
	}
	best := 1
	for i := 1; i < dcnt; i++ {
		v := divs[i]
		if v > best && v <= k && v < x {
			best = v
		}
	}
	return best
}

func appendInt(dst []byte, x int) []byte {
	if x == 0 {
		return append(dst, '0')
	}
	var buf [20]byte
	i := len(buf)
	for x > 0 {
		i--
		buf[i] = byte('0' + x%10)
		x /= 10
	}
	return append(dst, buf[i:]...)
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	n := 0
	for _, b := range data {
		if b >= '0' && b <= '9' {
			n = n*10 + int(b-'0')
		}
	}

	spf := sieve(2 * n)
	out := make([]byte, 0, n*8)

	for j := 0; j < n; j++ {
		c := n + j + 1
		k := n
		for k >= 2 {
			d := maxDivLE(c, k, spf)
			s := c - n
			hasS := s >= 2 && s <= k
			if !hasS && d < 2 {
				break
			}
			if hasS && s > d {
				c = ((n + s - 1) / s) * s
				k = s - 1
			} else {
				c -= d
				k = d - 1
			}
		}
		out = appendInt(out, c-1)
		if j+1 < n {
			out = append(out, ' ')
		}
	}
	out = append(out, '\n')
	os.Stdout.Write(out)
}
```