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

黑洞内窥:

输入数m,求一个m*m的-1,1矩阵

该矩阵满足任意两行对应项的积之和为0

m恒为2的幂次方,且小于2^10

思维光年:

这个有点像线代中的单位基,只不过不同的是元素都为-1和1

我们把题目中给出的m=2 的答案看做1 再组一个  的矩阵得到 m=4 的答案
把 m=4 的答案看做1 再组一个 得到 m=8 的答案

依次类推到10.。。。

ACcode:

(队友敲的)
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
 
int a[5][5] = {{0,0,0,0,0},{0,-1,-1,1,1},{0,-1,1,-1,1},{0,1,-1,-1,1},{0,-1,-1,-1,-1}};
int b[2000][2000],x,m;
 
void unionz(int x)
{
    for(int i = 1;i <= x; ++i)
        for(int j = 1;j <= x; ++j)
        {
            b[i][j + x] = b[i + x][j + x] = b[i][j];
            b[i + x][j] = -b[i][j];
        }
}
 
int main()
{
    scanf("%d",&m);
    if(m == 2) printf("1 1\n1 -1\n");
    else
    {
        x = 4;
        for(int i = 1; i <= 4; ++i)
            for(int j = 1; j <= 4; ++j)
                    b[i][j] = a[i][j];
        while(m > x) unionz(x),x *= 2;
        for(int i = 1;i <= m; ++i)
            for(int j = 1;j <= m; ++j)
            {
                printf("%d",b[i][j]);
                if(j == m) printf("\n");
                    else printf(" ");
            }
    }
    return 0;
}