【CF610C】Harmony Analysis-分治+構造
阿新 • • 發佈:2018-12-11
測試地址:Harmony Analysis 題目大意: 有個維向量,這些向量的每一維都是或,要求構造出一種情況使得,對任意兩個向量,它們的內積()為。 做法: 本題需要用到分治+構造。 首先看的情況,顯然解是這樣的: 那麼我們能不能用的情況推理出的情況呢?注意到我們可以把邊長為的矩陣分成塊邊長為的矩陣,如果這些矩陣都是時的解或者相反數,我們就能保證上半和下半部分內部向量對的內積為。關鍵是如何保證一個在上半,另一個在下半的向量對內積為。 我們可以仿照上面的形式,在當前解中填入上一層次的解和其相反數。這樣的話,跨越中線的向量對的左半部分內積和右半部分內積直接抵消,這樣就可以保證滿足條件了。 以下是本人程式碼:
#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;
}