C. Harmony Analysis(构造,递推)

直接想会非常棘手

考 虑 从 2 n − 1 维 空 间 递 推 到 2 n 维 空 间 考虑从2^{n-1}维空间递推到2^n维空间 2n12n

把 2 n − 1 维 空 间 构 造 得 向 量 看 成 一 个 矩 阵 把2^{n-1}维空间构造得向量看成一个矩阵 2n1

那 么 2 n 维 空 间 的 合 法 构 造 就 是 左 上 , 右 上 , 左 下 都 放 2 n − 1 维 的 矩 阵 那么2^n维空间的合法构造就是左上,右上,左下都放2^{n-1}维的矩阵 2n,,2n1

右 下 放 2 n − 1 维 的 矩 阵 的 相 反 数 右下放2^{n-1}维的矩阵的相反数 2n1

由 于 取 相 反 数 前 向 量 乘 积 是 0 , 那 么 取 相 反 数 后 不 改 变 由于取相反数前向量乘积是0,那么取相反数后不改变 0,

且 保 证 了 这 2 n 个 向 量 两 两 不 相 等 且 合 法 且保证了这2^n个向量两两不相等且合法 2n

#include 
using namespace std;
const int maxn=509;
int k,a[maxn][maxn];
void dfs(int n,int x,int y,int v)
{
	if( n==1 )	a[x][y]=v;
	else
	{
		dfs(n/2,x,y,v);
		dfs(n/2,x+n/2,y,v);
		dfs(n/2,x,y+n/2,v);
		dfs(n/2,x+n/2,y+n/2,-v);
	}
}
int main()
{
	cin >> k;
	dfs(1<

你可能感兴趣的:(CF刷题计划)