题意:

构造一个 n*n 的 只有 1 -1 的方阵
n为 2的1、2、3…10次方
使得任意两行的内积为0

题目链接:

https://ac.nowcoder.com/acm/contest/888/C

题解:

根据样例推出规律
用m的解推出2m的解
m的解 为方阵 A
2m的解 为
A  A
A -A

写法用分形

AC_code:

#include<bits/stdc++.h>
const int maxn = 100005;
int ss[3005][3005];
using namespace std;
int n;
void dfs(int b) {
    if(b == n) {
        return;
    }
    int m = 1<<b;
    for(int i = 0; i < m; i++) {
        for(int j = m; j < 2*m; j++) {
            ss[i][j] = ss[i][j-m];
        }
    }
    for(int i = 0; i < m; i++) {
        for(int j = m; j < 2*m; j++) {
            ss[j][i] = ss[j-m][i];
        }
    }
    for(int i = m; i < 2*m; i++) {
        for(int j = m; j < 2*m; j++) {
            ss[j][i] = -ss[j-m][i-m];
        }
    }
    dfs(b+1);
}
int main() {
    ss[0][0] = 1;
    int num;
    cin>>num;
    int q = num;
    n = 0;
    while(q) {
        q/=2;
        n++;
    }
    dfs(0);
    for(int i = 0; i < num; i++) {
        for(int j = 0; j < num; j++) {
            if(j != 0) printf(" ");
            printf("%d",ss[i][j]);
        }
        puts("");
    }
}