← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

type Item struct {
	run int32
	val int32
	sci int32
	pos int32
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	var getInt64 = func() int64 {
		scanner.Scan()
		res, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		return res
	}

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	var items []Item
	saveItems := true
	maxRuns := 0
	var totalK int64 = 0

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

		totalK += k
		if totalK > 200000 {
			saveItems = false
			items = nil
		}

		run_idx := int32(0)
		prev := a1
		if saveItems {
			items = append(items, Item{run: run_idx, val: int32(prev), sci: int32(i), pos: 1})
		}

		for j := int64(2); j <= k; j++ {
			curr := (prev*x + y) % m
			if curr < prev {
				run_idx++
			}
			if saveItems {
				items = append(items, Item{run: run_idx, val: int32(curr), sci: int32(i), pos: int32(j)})
			}
			prev = curr
		}

		if int(run_idx+1) > maxRuns {
			maxRuns = int(run_idx + 1)
		}
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	fmt.Fprintln(out, maxRuns-1)

	if saveItems && totalK <= 200000 {
		sort.Slice(items, func(i, j int) bool {
			if items[i].run != items[j].run {
				return items[i].run < items[j].run
			}
			if items[i].val != items[j].val {
				return items[i].val < items[j].val
			}
			if items[i].sci != items[j].sci {
				return items[i].sci < items[j].sci
			}
			return items[i].pos < items[j].pos
		})

		for _, item := range items {
			fmt.Fprintln(out, item.val, item.sci)
		}
	}
}