【CF610C】Harmony Analysis-分治+构造
测试地址: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;
}