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] 里储存的是 i 的二进制反码的子集和。
比如说 3=(0011)
其反码为 (1100),子集为 (0000),(0100),(1000),(1100)
那么 s[3] 里储存的就是 a[0]+a[4]+a[8]+a[12]
求问这个算法的原理,或者给出一个同样效果的算法也可以,thx。