矩阵的拆解之谜
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

给定一个 n \times n 的矩阵 A,我们想知道这个知道矩阵是否能表示成对称阵和反对称阵的和。如果能表示,请输出对称阵与反对称阵。可以证明,如果所求的两个矩阵存在,则这两个矩阵唯一。题目数据保证如果所求的两个矩阵存在,则对称阵与反对称阵内的元素必然为整数。

以下是一些名词的定义以及解释。


对称阵

定义:如果一个矩阵的转置等于自身,即 A^{T}=A ,那么这个矩阵就是对称矩阵。

- 数学表示:对于任意的 ij ,有 A_{i j}=A_{j i}

- 简单理解:对称阵关于主对角线对称。

例子:

A=\left(\begin{array}{lll}<br /><br />1 & 2 & 3 \\<br /><br />2 & 4 & 5 \\<br /><br />3 & 5 & 6<br /><br />\end{array}\right)

在这个矩阵中,A_{12}=A_{21}=2A_{13}=A_{31}=3 ,所以它是对称阵。

反对称阵

定义: 如果一个矩阵的转置等于它的负矩阵,即 A^{T}=-A ,那么这个矩阵就是反对称矩阵。

- 数学表示: 对于任意的 ij ,有 A_{i j}=-A_{j i},并且所有对角线上的元素都为 0 ,即 A_{i i}=0

- 简单理解:反对称阵关于主对角线反号对称。

例子:

A=\left(\begin{array}{ccc}<br /><br />0 & 2 & -1 \\<br /><br />-2 & 0 & 3 \\<br /><br />1 & -3 & 0<br /><br />\end{array}\right)

在这个矩阵中,A_{12}=-A_{21}=2A_{13}=-A_{31}=-1,并且主对角线元素 A_{11}=A_{22}= A_{33}=0,所以它是反对称阵。

矩阵加法

设有两个矩阵 AB,它们的大小都是 n \times m,即每个矩阵都有 n 行和 m 列。矩阵加法的规则是将对应位置的元素相加,得到一个新的矩阵 C,其中:

C_{ij} = A_{ij} + B_{ij}


输入描述:

第一行给出一个整数 n \; (1 \leq n \leq 500),表示矩阵的大小。

接下来有 n 行,每行给出 n 个整数。其中第 i 行第 j 列为 A_{i j} \; (-10^9 \leq A_{i j} \leq 10^9),即矩阵的第 i 行第 j 列的值。

输出描述:

如果所求的对称阵与反对称阵存在,第一行输出 YES,否则输出 NO。

如果存在,则接下来输出 2 n 行,每行 n 个整数,其中第 1 \sim n 行输出要求的对称阵,第 n + 1 \sim 2 n 行输出要求的反对称阵。

示例1

输入

复制
2
1 2
4 3

输出

复制
YES
1 3
3 3
0 -1
1 0