← Home
package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
	"strconv"
)

const mod int64 = 1000000007

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	var n, d int
	var x int64
	fmt.Fscan(in, &n, &d, &x)

	a := make([]int, n)
	pos := make([]int, n+1)
	for i := 0; i < n; i++ {
		a[i] = i + 1
		pos[i+1] = i
		x = (x*37 + 10007) % mod
		j := int(x % int64(i+1))
		if i != j {
			vi, vj := a[i], a[j]
			a[i], a[j] = vj, vi
			pos[vi], pos[vj] = j, i
		}
	}

	bArr := make([]byte, n)
	for i := 0; i < d; i++ {
		bArr[i] = 1
	}
	for i := 0; i < n; i++ {
		x = (x*37 + 10007) % mod
		j := int(x % int64(i+1))
		bArr[i], bArr[j] = bArr[j], bArr[i]
	}

	m := (n + 63) >> 6
	B := make([]uint64, m)
	minOne := n
	for i := 0; i < n; i++ {
		if bArr[i] != 0 {
			B[i>>6] |= uint64(1) << uint(i&63)
			if minOne == n {
				minOne = i
			}
		}
	}

	ans := make([]int, n)
	for i := 0; i < n; i++ {
		ans[i] = -1
	}

	if minOne < n {
		U := make([]uint64, m)
		for i := minOne; i < n; i++ {
			U[i>>6] |= uint64(1) << uint(i&63)
		}
		remaining := n - minOne

		for v := n; v >= 1 && remaining > 0; v-- {
			p := pos[v]
			ws := p >> 6
			bs := uint(p & 63)

			if bs == 0 {
				src := 0
				for w := ws; w < m; w++ {
					inter := U[w] & B[src]
					if inter != 0 {
						U[w] &^= inter
						remaining -= bits.OnesCount64(inter)
						base := w << 6
						for inter != 0 {
							tz := bits.TrailingZeros64(inter)
							ans[base+tz] = v - 1
							inter &= inter - 1
						}
					}
					src++
				}
			} else {
				rsh := 64 - bs
				var prev uint64
				src := 0
				for w := ws; w < m; w++ {
					cur := B[src]
					shifted := (cur << bs) | prev
					prev = cur >> rsh
					inter := U[w] & shifted
					if inter != 0 {
						U[w] &^= inter
						remaining -= bits.OnesCount64(inter)
						base := w << 6
						for inter != 0 {
							tz := bits.TrailingZeros64(inter)
							ans[base+tz] = v - 1
							inter &= inter - 1
						}
					}
					src++
				}
			}
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	buf := make([]byte, 0, 32)
	for i := 0; i < n; i++ {
		buf = strconv.AppendInt(buf[:0], int64(ans[i]), 10)
		out.Write(buf)
		out.WriteByte('\n')
	}
	out.Flush()
}