2019牛客暑期多校训练营(第八场)-C CDMA(递归构造)

题目链接: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;
}
原文地址:https://www.cnblogs.com/FrankChen831X/p/11342750.html