Description
用−1,0,1−1,0,1构造一个n×nn×n矩阵,使得行和,列和这2n2n个数字不同
Input
第一行一整数TT表示用例组数,每组用例输入一整数
Output
如果无解则输出impossibleimpossible,否则输出possiblepossible以及一种方案
Sample Input
2
1
2
Sample Output
impossible
possible
1 0
1 -1
Solution
行列和范围为[−n,n][−n,n]共2n+12n+1种取值,那么行列和若合法则至少有nn个非负,假设合法方案的行列和分别为,通过对行列的排序显然可以使得r1,...,rk≥0,c1,...,cn−k≥0r1,...,rk≥0,c1,...,cn−k≥0,考虑两个式子
∑i=1n|ri|+∑i=1n|ci|≥∑i=−nn|i|−n=n2∑i=1n|ri|+∑i=1n|ci|≥∑i=−nn|i|−n=n2
∑i=1n|ri|+∑i=1n|ci|===≤∑i=1kri−∑i=k+1nri+∑i=1n−kci+∑i=n−k+1nci∑i≤kaij−∑i>kaij+∑j≤n−kaij−∑i>n−kaij2∑i=1k∑j=1n−kaij−2∑i=k+1n∑j=n−k+1naij4k(n−k)∑i=1n|ri|+∑i=1n|ci|=∑i=1kri−∑i=k+1nri+∑i=1n−kci+∑i=n−k+1nci=∑i≤kaij−∑i>kaij+∑j≤n−kaij−∑i>n−kaij=2∑i=1k∑j=1n−kaij−2∑i=k+1n∑j=n−k+1naij≤4k(n−k)
两式比较有n2≤4k(n−k)n2≤4k(n−k),也即(n−2k)2≤0(n−2k)2≤0,该式成立当且仅当n=2kn=2k,故nn为奇数时无解,而当为偶数时,可以将矩阵斜对角线上放置若干n=2n=2时的2⋅22⋅2方阵,其余的在斜对角线上面方的全部放11,下方的全部放
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;
}