← Home
```go
package main

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

type FastScanner struct {
	r *bufio.Reader
}

func NewFastScanner() *FastScanner {
	return &FastScanner{r: bufio.NewReader(os.Stdin)}
}

func (fs *FastScanner) NextInt() int {
	sign := 1
	val := 0
	b, _ := fs.r.ReadByte()
	for (b < '0' || b > '9') && b != '-' {
		b, _ = fs.r.ReadByte()
	}
	if b == '-' {
		sign = -1
		b, _ = fs.r.ReadByte()
	}
	for b >= '0' && b <= '9' {
		val = val*10 + int(b-'0')
		b, _ = fs.r.ReadByte()
	}
	return val * sign
}

func ceilSqrt(x int) int {
	r := int(math.Sqrt(float64(x)))
	if r*r == x {
		return r
	}
	return r + 1
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	t := in.NextInt()
	for ; t > 0; t-- {
		n := in.NextInt()

		chain := []int{n}
		for chain[len(chain)-1] > 2 {
			chain = append(chain, ceilSqrt(chain[len(chain)-1]))
		}

		used := make([]bool, n+1)
		for _, v := range chain {
			if v >= 1 && v <= n {
				used[v] = true
			}
		}

		type pair struct{ x, y int }
		ops := make([]pair, 0, n+10)

		for i := 3; i <= n-1; i++ {
			if !used[i] {
				ops = append(ops, pair{i, n})
			}
		}

		for i := 0; i < len(chain)-1; i++ {
			ops = append(ops, pair{chain[i], chain[i+1]})
			ops = append(ops, pair{chain[i], chain[i+1]})
		}

		fmt.Fprintln(out, len(ops))
		for _, p := range ops {
			fmt.Fprintln(out, p.x, p.y)
		}
	}
}
```