package main

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

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

		// 设置大缓冲区,防止大输入时出错
		buf := make([]byte, 1024*1024) // 1MB
		scanner.Buffer(buf, 1024*1024)
		scanner.Split(bufio.ScanWords) // 按单词扫描(空格、换行等分隔)

		// 读取第一行:n
		scanner.Scan()
		n, _ := strconv.Atoi(scanner.Text())
		if n == 0 {
			break
		}
		scanner.Scan()
		k, _ := strconv.Atoi(scanner.Text())

		arr := make([]int, n)
		for i := 0; i < n; i++ {
			scanner.Scan()
			arr[i], _ = strconv.Atoi(scanner.Text())
		}
		process(arr, k)
		for i := 0; i < n; i++ {
			fmt.Printf("%d ", arr[i])
		}
	}
}

func process(arr []int, k int) {
	n := len(arr)
	l0, r0 := make([]int, n), make([]int, n)
	l0[0] = 1
  // 构建左边累成
	for i := 1; i < n; i++ {
		l0[i] = (l0[i-1] * arr[i-1]) % k
	}
	r0[n-1] = 1
    // 构建右边累成
	for i := n - 2; i >= 0; i-- {
		r0[i] = (r0[i+1] * arr[i+1]) % k
	}

	for i := 0; i < n; i++ {
		arr[i] = (l0[i] * r0[i]) % k
	}
}