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; }