题目大意:
让你构造一n*n矩阵使得每行平均值出现在该行,每列平均值出现在该列,且表中数字不同。无解输出-1
1
≤
n
≤
100
,
0
≤
a
[
i
]
[
j
]
≤
1
0
9
1\leq n\leq 100,0\leq a[i][j]\leq 10^9
1≤n≤100,0≤a[i][j]≤109
思路
首先我们可以发现奇数直接挨着排就可以排完,n=2输出-1
然后我们考虑偶数
[
1
2
3
.
.
.
n
−
1
a
.
.
.
.
.
.
.
.
.
]
\left[ \begin{matrix} 1& 2 & 3 & ... & n-1&a\\ ... \\ ...\\ ...\\ \end{matrix} \right]
⎣⎢⎢⎡1.........23...n−1a⎦⎥⎥⎤
我们让
n
−
1
n-1
n−1 为第一行平均数
那么
a
=
n
∗
(
n
−
1
)
−
n
∗
(
n
−
1
)
2
=
n
∗
(
n
−
1
)
2
a=n*(n-1)-\frac{n*(n-1)}{2}=\frac{n*(n-1)}{2}
a=n∗(n−1)−2n∗(n−1)=2n∗(n−1)
然后我们继续排:
[
1
2
3
.
.
.
n
−
1
a
1
+
a
.
.
.
2
a
1
+
2
a
.
.
.
3
a
.
.
.
1
+
(
n
−
2
)
a
.
.
.
(
n
−
1
)
a
1
+
x
.
.
.
a
+
x
]
\left[ \begin{matrix} 1& 2 & 3 & ... & n-1&a\\ 1+a&&&...&&2a \\ 1+2a&&&...&&3a\\ ...\\ 1+(n-2)a&&&...&&(n-1)a\\ 1+ x&&&...&&a+x\\ \end{matrix} \right]
⎣⎢⎢⎢⎢⎢⎢⎡11+a1+2a...1+(n−2)a1+x23...............n−1a2a3a(n−1)aa+x⎦⎥⎥⎥⎥⎥⎥⎤
我们考虑怎么处理最后一排
我们只要保证
a
[
n
]
[
1
]
a[n][1]
a[n][1]合法就可以了
那么仿照之前的操作:
x
=
n
∗
(
n
−
2
)
a
−
(
n
−
2
)
∗
(
n
−
1
)
2
a
=
(
n
−
2
)
∗
(
n
+
1
)
2
a
=
(
n
−
2
)
∗
(
n
−
1
)
∗
n
∗
(
n
+
1
)
4
x=n*(n-2)a-\frac{(n-2)*(n-1)}{2}a=\frac{(n-2)*(n+1)}{2}a=\frac{(n-2)*(n-1)*n*(n+1)}{4}
x=n∗(n−2)a−2(n−2)∗(n−1)a=2(n−2)∗(n+1)a=4(n−2)∗(n−1)∗n∗(n+1)
然后就结束了,右下角那个肯定没有超出范围
代码
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<deque>
#include<cstdio>
#include<bitset>
#include<vector>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
int read(){
int f=1,x=0;char c=getchar();
while(c<'0'||'9'<c){if(c=='-')f=-1;c=getchar();}
while('0'<=c&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();
return f*x;
}
#define MAXN 100
#define INF 0x3f3f3f3f
int hang[MAXN+5],lie[MAXN+5];
int main(){
//freopen("prosjecni.in","r",stdin);
//freopen("prosjecni.out","w",stdout);
int n=read();
if(n==2){
puts("-1");
return 0;
}
if(n&1)
for(int i=1;i<=n;i++){
for(int j=1;j<n;j++)
printf("%d ",(i-1)*n+j);
printf("%d\n",i*n);
}
else{
int x=n*(n-1)/2;
for(int i=1;i<n;i++){
for(int j=1;j<n;j++)
printf("%d ",j+(i-1)*x);
printf("%d\n",i*x);
}
for(int j=1;j<n;j++)
printf("%d ",j+(n+1)*(n-2)*x/2);
printf("%d\n",n*(n-1)/2+(n+1)*(n-2)*x/2);
}
return 0;
}