← Home
package main

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

var buffer []byte
var bpos, bsize int

func readInt() int64 {
	for bpos < bsize && buffer[bpos] <= 32 {
		bpos++
	}
	if bpos >= bsize {
		return 0
	}
	var res int64
	for bpos < bsize && buffer[bpos] > 32 {
		res = res*10 + int64(buffer[bpos]-'0')
		bpos++
	}
	return res
}

type FastHeap struct {
	data []uint64
	size int
}

func NewFastHeap(cap int) *FastHeap {
	return &FastHeap{
		data: make([]uint64, cap),
		size: 0,
	}
}

func (h *FastHeap) Push(x uint64) {
	j := h.size
	h.size++
	for j > 0 {
		i := (j - 1) / 2
		if h.data[i] <= x {
			break
		}
		h.data[j] = h.data[i]
		j = i
	}
	h.data[j] = x
}

func (h *FastHeap) Pop() uint64 {
	h.size--
	res := h.data[0]
	if h.size == 0 {
		return res
	}
	x := h.data[h.size]
	n := h.size
	i := 0
	half := n / 2
	for i < half {
		j := 2*i + 1
		if j+1 < n && h.data[j+1] < h.data[j] {
			j++
		}
		if x <= h.data[j] {
			break
		}
		h.data[i] = h.data[j]
		i = j
	}
	h.data[i] = x
	return res
}

type Seq struct {
	rem int32
	val int32
	x   int32
	y   int32
	m   int32
}

func main() {
	buffer, _ = io.ReadAll(os.Stdin)
	bsize = len(buffer)

	n := int(readInt())
	if n == 0 {
		return
	}

	seqs := make([]Seq, n)
	totalElements := int64(0)

	H1 := NewFastHeap(n)
	H2 := NewFastHeap(n)

	for i := 0; i < n; i++ {
		k := readInt()
		a1 := readInt()
		x := readInt()
		y := readInt()
		m := readInt()

		totalElements += k
		seqs[i] = Seq{
			rem: int32(k),
			val: int32(a1),
			x:   int32(x),
			y:   int32(y),
			m:   int32(m),
		}
		H1.Push((uint64(a1) << 32) | uint64(i))
	}

	var output []uint64
	if totalElements <= 200000 {
		output = make([]uint64, 0, totalElements)
	}

	descents := 0
	var currentLast int32 = -1

	for H1.size > 0 || H2.size > 0 {
		if H1.size == 0 {
			descents++
			H1, H2 = H2, H1
			currentLast = -1
		}

		entry := H1.Pop()
		val := int32(entry >> 32)
		seqIdx := int32(entry & 0xFFFFFFFF)

		currentLast = val

		if output != nil {
			output = append(output, entry)
		}

		s := &seqs[seqIdx]
		s.rem--
		if s.rem > 0 {
			s.val = int32((int64(s.val)*int64(s.x) + int64(s.y)) % int64(s.m))
			nextVal := s.val
			nextEntry := (uint64(nextVal) << 32) | uint64(seqIdx)
			if nextVal >= currentLast {
				H1.Push(nextEntry)
			} else {
				H2.Push(nextEntry)
			}
		}
	}

	fmt.Println(descents)
	if output != nil {
		out := bufio.NewWriterSize(os.Stdout, 65536)
		for _, entry := range output {
			val := int32(entry >> 32)
			seqIdx := int32(entry&0xFFFFFFFF) + 1
			writeInt(out, val)
			out.WriteByte(' ')
			writeInt(out, seqIdx)
			out.WriteByte('\n')
		}
		out.Flush()
	}
}

func writeInt(w *bufio.Writer, n int32) {
	if n == 0 {
		w.WriteByte('0')
		return
	}
	var buf [12]byte
	i := 11
	for n > 0 {
		buf[i] = byte(n%10 + '0')
		n /= 10
		i--
	}
	w.Write(buf[i+1:])
}