洛谷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;
}
posted @ 2026-04-30 18:32  quanjun  阅读(9)  评论(0)    收藏  举报