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;
}
浙公网安备 33010602011771号