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; }