← Home
package main

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

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

	// Custom buffer to handle potential large lines, though ScanWords is fine
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 1024*1024)

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

	a := make([]int, N)
	for i := 0; i < N; i++ {
		scanner.Scan()
		a[i], _ = strconv.Atoi(scanner.Text())
	}

	if N == 1 {
		c := (a[0] + a[0]) % M
		fmt.Println(1)
		fmt.Println(c)
		return
	}

	D := make([]int, N)
	for i := 0; i < N-1; i++ {
		D[i] = a[i+1] - a[i]
	}
	D[N-1] = M - a[N-1] + a[0]

	DR := make([]int, N)
	for i := 0; i < N-1; i++ {
		DR[i] = D[N-2-i]
	}
	DR[N-1] = D[N-1]

	S := make([]int, 2*N-1)
	for i := 0; i < N; i++ {
		S[i] = DR[i]
	}
	for i := 0; i < N-1; i++ {
		S[N+i] = DR[i]
	}

	pi := make([]int, N)
	for i := 1; i < N; i++ {
		j := pi[i-1]
		for j > 0 && D[i] != D[j] {
			j = pi[j-1]
		}
		if D[i] == D[j] {
			j++
		}
		pi[i] = j
	}

	var ans []int
	j := 0
	for i := 0; i < len(S); i++ {
		for j > 0 && S[i] != D[j] {
			j = pi[j-1]
		}
		if S[i] == D[j] {
			j++
		}
		if j == N {
			matchIndex := i - N + 1
			c := (a[0] + a[N-1-matchIndex]) % M
			ans = append(ans, c)
			j = pi[j-1]
		}
	}

	sort.Ints(ans)
	
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()
	
	fmt.Fprintln(out, len(ans))
	if len(ans) > 0 {
		for i, v := range ans {
			if i > 0 {
				fmt.Fprint(out, " ")
			}
			fmt.Fprint(out, v)
		}
		fmt.Fprintln(out)
	}
}