题目
题意让矩阵的任意两行相乘为0
题解:最开始的矩阵为1,然后,分成四份,右下是转置,其他复制,为啥要转置,因为如果基本矩阵成立,那么后来的矩阵向量本身*本身,就不是0了,
然后转置,就会发现,如果是自己的话,就是0,如果不是的话,因为在上半部分的时候,任意相乘为0,注意是0所以说,如果不是自己取反的话,因为在上半部分已经是0了,所以下半部分也是可以的。
一开始我也不懂怎么回事,后来写了一个4*4的矩阵,就会了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int val[530][530] , k;
void work(int n , int p , int q , int v)
{
if(n == 1){
val[p][q] = v;
// printf("%d %d %d\n",p,q,v);
}
else{
work(n/2 , p , q , v);
work(n/2 , p + n/2 , q , v);
work(n/2 , p , q + n/2 , v);
work(n/2 , p + n/2 , q + n/2 , -v);
}
}
void solve()
{
int res = 1 << k;
work(res , 1 , 1 , 1);//阶,左上起始坐标,是否去反
}
int main()
{
scanf("%d",&k);
solve();
for(int i = 1 ; i <= 1 << k ; i++){
for(int j = 1 ; j <= 1 << k ; j++){
if(val[i][j] == 1) printf("+");
else printf("*");
}
printf("\n");
}
return 0;
}
版切第一题,人一我百,人十我万,穷尽一生,只为最强