http://codeforces.com/contest/610/problem/C
給一個數k,要求構造2^k個向量,著2^k個向量兩兩正交,向量維數為2^k
思路:遞迴構造
如果k=0,假設是1,k=1
1 1
1 -1
也就是把前一個複製4分,右下角的為負值。
這樣的合理性很容易看出,。。
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int SIZE = (1<<9)+1;char mat[10][SIZE][SIZE];void init() { mat[0][0][0] = '+'; mat[0][1][0] = '*'; for(int k=1;k<10;k++) { int sz = (1<<(k-1)); for(int j=0;j<sz;j++) { for(int i=0;i<sz;i++) { mat[k][j][i] = mat[k-1][j][i]; } } //r u for(int j=0;j<sz;j++) { for(int i=sz;i<sz*2;i++) { mat[k][j][i] = mat[k-1][j][i-sz]; } } //l d for(int j=sz;j<sz*2;j++) { for(int i=0;i<sz;i++) { mat[k][j][i] = mat[k-1][j-sz][i]; } } //r d for(int j=sz;j<sz*2;j++) { for(int i=sz;i<sz*2;i++) { mat[k][j][i] = (mat[k-1][j-sz][i-sz]=='*')?'+':'*'; } } //cout << "k=" << k << endl; }}void print(int k) { int sz = (1<<k); for(int i=0;i<sz;i++) { for(int j=0;j<sz;j++) { putchar(mat[k][i][j]); } putchar('\n'); }}int main() { init(); int k; while(cin >> k) { print(k); } return 0;}