题目链接:https://ac.nowcoder.com/acm/contest/888/C
题意:输入m(为2的n次幂,n<=10),构造一个m*m的矩阵满足任意不同的两行的元素乘积和为0。
思路:假设矩阵A是合法的矩阵,大小为m*m,m=2^n,那么我们可以构造出如下大小为2m*2m的合法矩阵:
A A
A -A
仔细分析就可证明其正确性。
AC代码:
#include<cstdio> #include<algorithm> #include<map> using namespace std; int n,m; int a[1050][1050]; map<int,int> mp; int main(){ scanf("%d",&m); for(int i=1;i<=10;++i) mp[1<<i]=i; n=mp[m]-1; a[1][1]=1,a[1][2]=1; a[2][1]=1,a[2][2]=-1; int len=2; while(n--){ for(int i=1;i<=len;++i) for(int j=len+1;j<=2*len;++j) a[i][j]=a[i][j-len]; for(int i=len+1;i<=2*len;++i) for(int j=1;j<=2*len;++j) if(j<=len) a[i][j]=a[i-len][j]; else a[i][j]=-a[i-len][j]; len<<=1; } for(int i=1;i<=len;++i){ for(int j=1;j<=len;++j) printf("%d ",a[i][j]); printf(" "); } return 0; }