求问关于快速预处理二进制子集和
  • 板块学术版
  • 楼主Sicosuki
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/9/12 21:37
  • 上次更新2024/9/13 13:39:24
查看原帖
求问关于快速预处理二进制子集和
914358
Sicosuki楼主2024/9/12 21:37

rt,有以下代码:

#include <iostream>
using namespace std;
const int ma = 4e5 + 10;
int n,m = 1,s[ma];
signed main()
{
	cin >> n;
	while(m < n)m <<= 1;
	for(int i = 0; i <= n; i++)
		s[m-i-1] = a[i];
	for (int i = 1; i < m; i <<= 1)
	    for (int j = 0; j < m; j += i << 1)
	        for (int k = 0; k < i; ++k)
	        	s[j+k] += s[j+k+i];
}

最后 s[i]s[i] 里储存的是 i 的二进制反码的子集和。

比如说 3=(0011)3 = (0011)

其反码为 (1100)(1100),子集为 (0000),(0100),(1000),(1100)(0000),(0100),(1000),(1100)

那么 s[3]s[3] 里储存的就是 a[0]+a[4]+a[8]+a[12]a[0]+a[4]+a[8]+a[12]

求问这个算法的原理,或者给出一个同样效果的算法也可以,thx。

2024/9/12 21:37
加载中...