随笔 - 73  文章 - 0 评论 - 0 阅读 - 6643
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

FWT

FFT是加速加法卷积的一个方法.Ci=j+k=iAj×Bk

FWT是加速位运算卷积的方法.Ci=jk=iAj×Bk

可以表示&,| ^

//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);
posted on   naiji  阅读(189)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示