题意:已知向量中每个坐标的值都为1或者-1.
0<=k<=9,给出k,构造出2^k个2^k维向量,使得任意这2^k个向量中任意两个向量点积为0.
Walsh矩阵:H[k]={2^k * 2^k}的矩阵 任意两个行向量点乘结果为0.构造方法如下.
{H[2^(k-1)],H[2^(k-1)]}
0<=k<=9,给出k,构造出2^k个2^k维向量,使得任意这2^k个向量中任意两个向量点积为0.
Walsh矩阵:H[k]={2^k * 2^k}的矩阵 任意两个行向量点乘结果为0.构造方法如下.
{H[2^(k-1)],H[2^(k-1)]}
{H[2^(k-1)],-H[2^(k-1)]}
#include <bits/stdc++.h>
using namespace std;
const int N=2e3+5;
int n,a[N][N],b[N][N],c[N][N];
void calc(int n,int b[N][N])
{
if(n==1)
{
b[1][1]=1,b[1][2]=1;
b[2][1]=1,b[2][2]=-1;
return;
}
calc(n-1,b);
int m=(1<<(n-1));
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
c[i][j]=b[i][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
c[i+m][j]=b[i][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
c[i][j+m]=b[i][j];
for(int i=1;i<=m;i++)
for(int j=1;j<=m;j++)
c[i+m][j+m]=-b[i][j];
for(int i=1;i<=2*m;i++)
for(int j=1;j<=2*m;j++)
b[i][j]=c[i][j];
}
int main()
{
cin>>n;
if(n==0)
{
printf("+\n");
return 0;
}
calc(n,a);
int m=(1<<n);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
printf("%c",a[i][j]==1?'+':'*');
printf("\n");
}
return 0;
}