题解:AT_abc367_g [ABC367G] Sum of (XOR^K or 0)
Soluton
令 \(v=2^{20}-1\)。
异或和的次幂非常不可做,考虑求出异或和为 \(i\) 的方案数 \(ct_i\),答案即为 \(\sum_{i=0}^{v}ct_i\times i^k\)。
考虑集合幂级数。设 \(x,y\),它们的乘法分别定义为 \(x^a\cdot x^b=x^{a\text{ xor }b}\),\(y^a\cdot y^b=y^{(a+b)\bmod m}\)。那么 \(ct_t\) 就是:
加入 \(\text{FWT}\),简易说明一下 \(\text{FWT}\):
原来那个式子变成:
由于 \(\text{FWT}\) 的线性性,把 \([y^0]\) 放进去:
外面的 \(\text{IFWT}\) 最后做一下就好了,不用管它,我们来观察 \(\prod_{j=1}^{n}[x^i]\text{FWT}(1+yx^{p})\) 有没有啥性质。
容易发现:
那么我们设 \(\prod_{j=1}^{n}[x^i]\text{FWT}(1+yx^{A_j}))=(1+y)^{a_i}(1-y)^{b_i}\)。这个 \(a_i,b_i\) 怎么求呢?
可以发现设 \(f=\sum x^i\sum_{j=1}^{n}[A_j=i]\),\(a_i-b_i\) 就是 \([x^i]\text{FWT}(f)\)。
我们再把式子拿回来:
\((1+y)^{a_i},(1-y)^{b_i}\) 都可以 \(\mathcal{O}(nm)\) 预处理展开后的系数。而 \((a_i,b_i)\) 总共只有 \(n+1\) 种,每种 \((1+y)^{a_i}(1-y)^{b_i}\) 的 \(y^0\) 项系数可以 \(\mathcal{O}(m)\) 求出。这部分预处理总复杂度 \(\mathcal{O}(nm)\)。
综上,我们在 \(\mathcal{O}(nm)\) 时间内处理出了 \(\sum x^i\cdot[y^0]((1+y)^{a_i}(1-y)^{b_i}\),最后 \(\text{IFWT}\) 一下即可得出答案。
求 \(i^k\) 部分拿个线性筛可以变成 \(\frac{v\log k}{\log v}\),不过没啥必要。
时间复杂度 \(\mathcal{O}(nm+v\log v+v\log k)\)。
Summary
主要思路:
- 写出式子
- 化简 \(\prod_{j=1}^{n}[x^i]\text{FWT}(1+yx^{A_j}))\)。
- 直接做即可。
Code
const int N = 2e5 + 5, M = 105, K = 1.1e6 + 5, mod = 998244353;
typedef Mint<mod> MI;
int n, m, k, x; MI rs, f[K], A[N][M], B[N][M], coe[N];
void fwt(MI* f, int n, int op) {
MI inv2 = (MI)1 / 2;
REP(i, 0, n - 1) REP(j, 0, (1 << n) - 1) {
if (j >> i & 1) continue;
MI x = f[j], y = f[j ^ 1 << i];
f[j] = x + y, f[j ^ 1 << i] = x - y;
if (op < 0) f[j] *= inv2, f[j ^ 1 << i] *= inv2;
}
}
int main() {
cin >> n >> m >> k;
REP(i, 1, n) cin >> x, f[x] += 1;
A[0][0] = B[0][0] = 1;
REP(i, 0, n - 1) REP(j, 0, m - 1) {
A[i + 1][j] += A[i][j];
A[i + 1][(j + 1) % m] += A[i][j];
B[i + 1][j] += B[i][j];
B[i + 1][(j + 1) % m] -= B[i][j];
}
REP(i, 0, n) REP(j, 0, m - 1)
coe[i] += A[i][j] * B[n - i][(m - j) % m];
fwt(f, 20, 1);
REP(i, 0, (1 << 20) - 1)
f[i] = coe[(f[i] + n).x / 2];
fwt(f, 20, -1);
REP(i, 0, (1 << 20) - 1)
rs += f[i] * qpow((MI)i, k);
cout << rs << '\n';
return 0;
}
``

浙公网安备 33010602011771号