题目链接:https://ac.nowcoder.com/acm/contest/888/C
题意:让你构造n*n的矩阵,要求任意两行对应位置的数相乘再求和,使得和为零。
根据样例1
1 1
1 -1
先自己构造一下4 * 4 的矩阵
1 1 1 1
1 -1 -1 1
-1 -1 1 1
-1 1 -1 1
染色之后,可以发现以黑色框内的数字为基准,红色框是黑色框的镜像翻转,蓝色框是黑色框的取相反数,紫色框是红色框平移
看出来这个规律之后就好写了
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5+ 10;
int ans[1025][1025];
void solve(int n) {
ans[0][0] = 1; ans[0][1] = 1;
ans[1][0] = 1; ans[1][1] = -1;
int cnt = 2;
while(n>2){
cnt<<=1;
for(int i = 0; i < cnt; i++) {
for(int j = 0; j <cnt; j++) {
if(j>=cnt/2 && i < cnt/2) {
ans[i][j] = ans[i][cnt - j - 1];
continue;
}
if(i >= cnt / 2 && j < cnt / 2){
ans[i][j] = -ans[i%(cnt/2)][j];
continue;
}
if(i >= cnt/2 && j >= cnt / 2) {
ans[i][j] = ans[i%(cnt/2)][j];
continue;
}
}
}
n>>=1;
}
for(int i = 0; i < cnt; i++) {
for(int j = 0; j <cnt-1; j++) {
printf("%d ", ans[i][j]);
}
printf("%d\n", ans[i][cnt-1]);
}
}
int main()
{
int n;
scanf("%d", &n);
solve(n);
return 0;
}