[HNOI2010]MATRIX 矩阵
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

小Z近日闲来无事,便研究起矩阵来。他先谢了一个N×M的矩阵,每个格子里填入了一个小于P的非负整数,然后他对于每个2×2的子矩阵,算出了其中数的和。

譬如N=3,M=3,P=3,小Z写的矩阵如下:

共有4个2×2的子矩阵,容易算出它们的和如下:

(第一行和第一列的0是为了格式美观而添加进去的)

现在小Z想试一试能不能根据这些和推算出原矩阵。由于小Z的数学并不好,因此这个任务就交给你了。

当然,小Z早就发现了,解很可能不唯一,譬如下面的矩阵算出的和与A相同:

示意图在有多个矩阵满足要求的情况下请你输出字典序最小的哪一个。

字典序的比较方式如下:对于两个解矩阵X和Y,找到X和Y不同的位置中行数最小的那一个格子,若有多个则取列数最小的那个格子,该位置较小的矩阵字典序较小。

譬如上述的矩阵A和B,第一个不同的格子应是第一行第二个格子,而A[1][2]<B[1][2],故矩阵A的字典序比B小。

另外,小Z的数学还没有差到加法都做错,因此保证输入数据都是有解的。

输入描述:

第一行包含三个正整数N M P表示矩阵的行数列数以及每个数的范围,接下来N行每行包含M个非负整数,其中第i行第j个数表示以格子(i,j)为右下角的2*2子矩阵中的数的和。保证第一行与第一列的数均为0,且每个和都不超过4(P-1)。

输出描述:

包含N行,每行M个整数,描述你求出的矩阵,相邻的整数用空格分开。(行末不要有多余空格)
示例1

输入

复制
3 3 3                     	   
0 0 0						   
0 4 5						   
0 5 3

输出

复制
0 0 2
2 2 1
1 0 0

备注: