Codeforces Round #337 (Div. 2) C. Harmony Analysis (构造)

题意:

给一个k,求2^k个2^k维的向量,两两垂直。

已知求出k=n时的结果为一个矩阵a,求k=n+1时只需构造

a  a

a -a

就可以了,正确性一想就能知道。

 

比赛时一直没有思路,dp没想出,甚至打印出来想找规律orz……

 

#include <bits/stdc++.h>

using namespace std;

int p[10] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512};

int a[600][600];

void _copy(int x, int y, int cx, int cy, int n)
{
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            a[cx+i][cy+j] = a[x+i][y+j];
        }
    }
}

void __copy(int x, int y, int cx, int cy, int n)
{
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            a[cx+i][cy+j] = !a[x+i][y+j];
        }
    }
}

void solve(int n)
{
    if (n == 0) {
        a[1][1] = 1;
    } else {
        solve(n-1);
        _copy(1, 1, 1, p[n-1]+1, p[n-1]);
        _copy(1, 1, p[n-1]+1, 1, p[n-1]);
        __copy(1, 1, p[n-1]+1, p[n-1]+1, p[n-1]);
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    solve(n);
    for (int i = 1; i <= p[n]; ++i) {
        for (int j = 1; j <= p[n]; ++j) {
            if (a[i][j]) printf("+");
            else printf("*");
        }
        printf("\n");
    }
    return 0;
}

  

posted @ 2015-12-29 09:54  我不吃饼干呀  阅读(280)  评论(0编辑  收藏  举报