1. 程式人生 > >【CF610C】Harmony Analysis-分治+構造

【CF610C】Harmony Analysis-分治+構造

測試地址:Harmony Analysis 題目大意:2k2^k2k2^k維向量,這些向量的每一維都是111-1,要求構造出一種情況使得,對任意兩個向量,它們的內積(aibi\sum a_i\cdot b_i)為00做法: 本題需要用到分治+構造。 首先看k=1k=1的情況,顯然解是這樣的: +1,+1+1,+1 +1,1+1,-1 那麼我們能不能用k=1k=1的情況推理出k=2k=2的情況呢?注意到我們可以把邊長為2k2^k的矩陣分成44塊邊長為2k12^{k-1}的矩陣,如果這些矩陣都是k

1k-1時的解或者相反數,我們就能保證上半和下半部分內部向量對的內積為00。關鍵是如何保證一個在上半,另一個在下半的向量對內積為00。 我們可以仿照上面k=1k=1的形式,在當前解中填入上一層次的解和其相反數。這樣的話,跨越中線的向量對的左半部分內積和右半部分內積直接抵消,這樣就可以保證滿足條件了。 以下是本人程式碼:

#include <bits/stdc++.h>
using namespace std;
int k,a[1010][1010];

int main()
{
	scanf("%d",&k);
	a[0][0]=1;
	for(int i=1;i<=k;i++
) for(int x=0;x<(1<<(i-1));x++) for(int y=0;y<(1<<(i-1));y++) { a[x+(1<<(i-1))][y]=a[x][y]; a[x][y+(1<<(i-1))]=a[x][y]; a[x+(1<<(i-1))][y+(1<<(i-1))]=-a[x][y]; } for(int i=0;i<(1<<k);i++) { for(int j=0;j<(1<<k);j++) printf
("%c",(a[i][j]>0)?'+':'*'); printf("\n"); } return 0; }