普通求前缀和,是容斥意义下去做的
而如果我们用这种思路带向高维,则其复杂度是\(O(n2^d)\,\,\,d\)是维数 的
高维前缀和可以做到 \(O(nd)\)
具体方法就是对每一位分别做前缀和,然后再拼起来就可以了
画个图
大概……就是这样吧
这个东西可以代替一部分的枚举子集,好像还能优化 DP ,但我还没见到过,见到了再写
代码也挺好写的,两层循环,外面枚举现在到了第几维了,里面进行前缀和就可以了
贴个二进制下的板子
for(int j = 0; j < n; j++)
for(int i = 0; i < 1 << n; i++)
if(i >> j & 1) f[i] += f[i ^ (1 << j)];
其实主要是因为今天要写FMT和FWT才现学的这玩意儿