← Home
```go
package main

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

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func main() {
	var n int
	fmt.Scan(&n)

	const M = 2000010
	divisors := make([][]int, M+1)
	for i := 1; i <= M; i++ {
		for j := i; j <= M; j += i {
			divisors[j] = append(divisors[j], i)
		}
	}

	perm := make([]int, n+1)
	for j := 1; j <= n; j++ {
		current_p := j
		current_k := n
		for current_k >= 2 {
			t := current_p + current_k
			l := max(2, t-n)
			r := min(current_k, t/2)
			maxk := 0
			divs := divisors[t]
			for _, d := range divs {
				if d >= l && d <= r {
					if d > maxk {
						maxk = d
					}
				}
			}
			kspe := t - n
			special_valid := kspe >= 2 && kspe <= current_k && (n%kspe != 0)
			if special_valid {
				if kspe > maxk {
					maxk = kspe
				} else {
					maxk = max(maxk, kspe)
				}
			}
			if maxk == 0 {
				current_p += current_k - 1
				break
			} else {
				d := current_k - maxk
				current_p += d
				q := (current_p - 1) / maxk
				bstart := q*maxk + 1
				current_p = bstart
				current_k = maxk - 1
			}
		}
		perm[j] = current_p
	}

	out := bufio.NewWriter(os.Stdout)
	for i := 1; i <= n; i++ {
		if i > 1 {
			out.WriteString(" ")
		}
		fmt.Fprintf(out, "%d", perm[i])
	}
	out.WriteString("\n")
	out.Flush()
}
```