2019牛客暑期多校训练营(第八场) C CDMA (思维+构造)

题目链接:https://ac.nowcoder.com/acm/contest/888/C

题意:让你构造n*n的矩阵,要求任意两行对应位置的数相乘再求和,使得和为零。

根据样例1 

1 1 

1 -1

先自己构造一下4 * 4 的矩阵

1      1     1     1 

1     -1    -1     1

-1    -1     1     1

-1     1    -1     1

染色之后,可以发现以黑色框内的数字为基准,红色框是黑色框的镜像翻转,蓝色框是黑色框的取相反数,紫色框是红色框平移

看出来这个规律之后就好写了

#include <bits/stdc++.h>
 
using namespace std;
#define ll long long
const int maxn = 1e5+ 10;
int ans[1025][1025];
void solve(int n) {
    ans[0][0] = 1; ans[0][1] = 1;
    ans[1][0] = 1; ans[1][1] = -1;
    int cnt = 2;
    while(n>2){
        cnt<<=1;
        for(int i = 0; i < cnt; i++) {
            for(int j = 0; j <cnt; j++) {
                if(j>=cnt/2 && i < cnt/2) {
                    ans[i][j] = ans[i][cnt - j - 1];
                    continue;
                }
                if(i >= cnt / 2 && j < cnt / 2){
                    ans[i][j] = -ans[i%(cnt/2)][j];
                    continue;
                }
                if(i >= cnt/2 && j >= cnt / 2) {
                    ans[i][j] = ans[i%(cnt/2)][j];
                    continue;
                }
            }
        }
        n>>=1;
    }
    for(int i = 0; i < cnt; i++) {
        for(int j = 0; j <cnt-1; j++) { 
            printf("%d ", ans[i][j]);
        }
        printf("%d\n", ans[i][cnt-1]);
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    solve(n);
    return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值