洛谷U682392 异或和计数 题解 FWT模板题
题目链接:https://www.luogu.com.cn/problem/U682392
就是维护一个桶,对桶数组求 FWT 即可。
\(0\) 要特判。
示例程序:
#include <bits/stdc++.h>
using namespace std;
const int maxn = (1<<18) + 5;
int n, m;
long long a[maxn], zero_cnt;
void fwt(int step) { // 1:顺变换; 2:逆变换
for (int x = 2; x <= (1<<n); x <<= 1) {
int k = x >> 1;
for (int i = 0; i < (1<<n); i += x) {
for (int j = 0; j < k; j++) {
long long s1 = a[i+j], s2 = a[i+j+k];
a[i+j] = s1 + s2;
a[i+j+k] = s1 - s2;
if (step == 2) {
a[i+j] /= 2;
a[i+j+k] /= 2;
}
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 0, x; i < m; i++) {
scanf("%d", &x);
a[x]++;
}
for (int i = 0; i < (1<<n); i++)
zero_cnt += a[i] * (a[i] - 1) / 2;
fwt(1);
for (int i = 0; i < (1<<n); i++)
a[i] *= a[i];
fwt(2);
printf("%lld", zero_cnt);
for (int i = 1; i < (1<<n); i++)
printf(" %lld", a[i] / 2);
return 0;
}
浙公网安备 33010602011771号