题解:AT_abc367_g [ABC367G] Sum of (XOR^K or 0)
Soluton
令
异或和的次幂非常不可做,考虑求出异或和为
考虑集合幂级数。设
加入
原来那个式子变成:
由于
外面的
容易发现:
那么我们设
可以发现设
我们再把式子拿回来:
综上,我们在
求
时间复杂度
Summary
主要思路:
- 写出式子
- 化简
。 - 直接做即可。
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;
}
``
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现