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
}
}