FWT
FFT是加速加法卷积的一个方法.
FWT是加速位运算卷积的方法.
可以表示&,| ^
//n表示pa,pb两个数组有有2^n个有效元素,下标[0,2^n-1]
int mod = 998244353;
void FWTor(int a[], int type)
{
int i, j, k;
for (i = 1; i <= n; i++)
for (j = 0; j < (1 << n); j += 1 << i)
for (k = 0; k < (1 << i - 1); k++)
(a[j | (1 << i - 1) | k] += (a[j | k] * type + mod) % mod) %= mod;
}
void FWTand(int a[], int type)
{
int i, j, k;
for (i = 1; i <= n; i++)
for (j = 0; j < (1 << n); j += 1 << i)
for (k = 0; k < (1 << i - 1); k++)
(a[j | k] += (a[j | (1 << i - 1) | k] * type + mod) % mod) %= mod;
}
void FWTxor(int a[], long long type)
{
int i, j, k, x, y;
for (i = 1; i <= n; i++)
for (j = 0; j < (1 << n); j += 1 << i)
for (k = 0; k < (1 << i - 1); k++)
x = (a[j | k] + a[j | (1 << i - 1) | k]) * type % mod,
y = (a[j | k] - a[j | (1 << i - 1) | k] + mod) * type % mod,
a[j | k] = x, a[j | (1 << i - 1) | k] = y;
}
//or
FWTor(pa, 1); FWTor(pb, 1);
for (int i = 0; i < (1 << n); i++)
pa[i] = (ll)pa[i] * pb[i] % mod;
FWTor(pa, -1);
//and
FWTand(pa, 1); FWTand(pb, 1);
for (int i = 0; i < (1 << n); i++)
pa[i] = (ll)pa[i] * pb[i] % mod;
FWTand(pa, -1);
//xor
FWTxor(pa, 1); FWTxor(pb, 1);
for (int i = 0; i < (1 << n); i++)
pa[i] = (ll)pa[i] * pb[i] % mod;
FWTxor(pa, (mod + 1) >> 1);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!