Description
用 −1,0,1 − 1 , 0 , 1 构造一个 n×n n × n 矩阵,使得行和,列和这 2n 2 n 个数字不同
Input
第一行一整数 T T 表示用例组数,每组用例输入一整数
Output
如果无解则输出 impossible i m p o s s i b l e ,否则输出 possible p o s s i b l e 以及一种方案
Sample Input
2
1
2
Sample Output
impossible
possible
1 0
1 -1
Solution
行列和范围为
[−n,n]
[
−
n
,
n
]
共
2n+1
2
n
+
1
种取值,那么行列和若合法则至少有
n
n
个非负,假设合法方案的行列和分别为,通过对行列的排序显然可以使得
r1,...,rk≥0,c1,...,cn−k≥0
r
1
,
.
.
.
,
r
k
≥
0
,
c
1
,
.
.
.
,
c
n
−
k
≥
0
,考虑两个式子
两式比较有 n2≤4k(n−k) n 2 ≤ 4 k ( n − k ) ,也即 (n−2k)2≤0 ( n − 2 k ) 2 ≤ 0 ,该式成立当且仅当 n=2k n = 2 k ,故 n n 为奇数时无解,而当为偶数时,可以将矩阵斜对角线上放置若干 n=2 n = 2 时的 2⋅2 2 ⋅ 2 方阵,其余的在斜对角线上面方的全部放 1 1 ,下方的全部放
Code
#include<cstdio>
using namespace std;
int T,n;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
if(n%2==0)
{
printf("possible\n");
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int a;
if(i+j<=n)a=1;
else if(i+j==n+1)
{
if(i&1)a=0;
else a=1;
}
else a=-1;
printf("%d%c",a,j==n?'\n':' ');
}
}
else printf("impossible\n");
}
return 0;
}