FWT 学习笔记

FWT 学习笔记

学的时候比较匆忙,于是就学一个 \(\texttt{or,and,xor}\) 卷积跑路。

P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)

前置知识:高维前缀和,下面前缀和的操作大多都是用高维前缀和来实现的。

设有两个长度为 \(2^n\) 的序列 \(A,B\),现在我们要对他们进行一下不同类型的卷积。

\(\texttt{or}\) 卷积

\[C_i=\sum_{j~\texttt{or}~k=i}A_j\times B_k \]

考虑 \(n\) 只有 \(1\) 的情况,即 \(A,B\) 的长度都只有 \(2\) 时值怎么样的:

\[C_0=A_0\times B_0\\ C_1=A_0\times B_1+A_1\times B_0+A_1\times B_1\\ C_0+C_1=(A_0+A_1)\times (B_0+B_1) \]

受到面式子的启发,考虑将 \(A,B\) 分别进行一次前缀和,每一个对应为乘起来记为 \(C\),再对 \(C\) 做一遍前缀差即可。

\(\texttt{and}\) 卷积

\[C_i=\sum_{j~\texttt{and}~k=i}A_j\times B_k \]

仍然考虑 \(n\) 只有 \(1\)

\[C_0=A_0\times B_0+A_0\times B_1+A_1\times B_0\\ C_1=A_1\times B_1\\ C_0+C_1=(A_0+A_1)\times (B_0+B_1) \]

\(A,B\) 都做一遍后缀和,按位乘起来记为 \(C\),再对 \(C\) 做一遍后缀差即可。

\(\texttt{xor}\) 卷积

\[C_i=\sum_{j~\texttt{xor}~k=i}A_j\times B_k \]

考虑 \(n\) 只有 \(1\)

\[C_0=A_0\times B_0+A_1\times B_1\\ C_1=A_0\times B_1+A_1\times B_0\\ \begin{cases} C_0+C_1=(A_0+A_1)\times (B_0+B_1)\\ C_0-C_1=(A_0-A_1)\times (B_0-B_1) \end{cases} \]

那么根据高维前缀和每一位相减过去即可。

模板题代码

// Author:A weak man named EricQian
#include<bits/stdc++.h>
using namespace std;
#define infll 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define Maxn 200005
#define mod 998244353
#define pb push_back
#define pa pair<int,int>
#define fi first
#define se second
typedef long long ll;
inline int rd()
{int x=0;char ch,t=0;while(!isdigit(ch = getchar())) t|=ch=='-';while(isdigit(ch)) x=x*10+(ch^48),ch=getchar();return x=t?-x:x;
}
inline ll maxll(ll x,ll y){ return x>y?x:y; }
inline ll minll(ll x,ll y){ return x<y?x:y; }
inline ll absll(ll x){ return x>0ll?x:-x; }
inline ll gcd(ll x,ll y){ return (y==0)?x:gcd(y,x%y); }
struct FWT
{int n;inline int ksm(int x,int y){int ret=1;for(;y;y>>=1,x=1ll*x*x%mod) if(y&1) ret=1ll*ret*x%mod;return ret;}inline void bitmul(int *a,int *b){ for(int i=0;i<n;i++) a[i]=1ll*a[i]*b[i]%mod; }inline void fwt_or(int *a,int opt){for(int p=2;p<=n;p<<=1) for(int i=0;i<n;i+=p) for(int j=0;j<(p>>1);j++)(a[i+j+(p>>1)]+=1ll*a[i+j]*opt%mod)%=mod;}inline void fwt_and(int *a,int opt){for(int p=2;p<=n;p<<=1) for(int i=0;i<n;i+=p) for(int j=0;j<(p>>1);j++)(a[i+j]+=1ll*a[i+j+(p>>1)]*opt%mod)%=mod;}inline void fwt_xor(int *a,int opt){for(int p=2;p<=n;p<<=1) for(int i=0;i<n;i+=p) for(int j=0;j<(p>>1);j++){int x=a[i+j],y=a[i+j+(p>>1)];a[i+j]=1ll*(x+y)%mod*opt%mod;a[i+j+(p>>1)]=1ll*(x-y+mod)%mod*opt%mod;}}
}P;
int n,All;
int a[Maxn],b[Maxn],A[Maxn],B[Maxn];
int main()
{//ios::sync_with_stdio(false); cin.tie(0);//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=rd(),All=1<<n,P.n=All;for(int i=0;i<All;i++) a[i]=rd();for(int i=0;i<All;i++) b[i]=rd();memcpy(A,a,sizeof(a)),memcpy(B,b,sizeof(b));P.fwt_or(A,1),P.fwt_or(B,1),P.bitmul(A,B),P.fwt_or(A,mod-1);for(int i=0;i<All;i++) printf("%d ",A[i]);printf("\n");memcpy(A,a,sizeof(a)),memcpy(B,b,sizeof(b));P.fwt_and(A,1),P.fwt_and(B,1),P.bitmul(A,B),P.fwt_and(A,mod-1);for(int i=0;i<All;i++) printf("%d ",A[i]);printf("\n");memcpy(A,a,sizeof(a)),memcpy(B,b,sizeof(b));P.fwt_xor(A,1),P.fwt_xor(B,1),P.bitmul(A,B),P.fwt_xor(A,P.ksm(2,mod-2));for(int i=0;i<All;i++) printf("%d ",A[i]);printf("\n");//fclose(stdin);//fclose(stdout);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大盗阿福

大盗阿福 题意&#xff1a; 长度为n的数组a&#xff0c;不能取连续的数&#xff0c;问所能取的最大值是多少 题解&#xff1a; 设dp[i][0]表示第i个数不选&#xff0c;dp[i][1]表示第i个数选 如果第i个数不选&#xff0c;那么第i-1个数可以选也可以不选&#xff0c;我们取最…

YBTOJ:采矿战略(线段树维护dp、树链剖分)

文章目录题目描述解析代码题目描述 所谓线段树维护dp&#xff0c;就是在线段树上维护dp &#xff08;逃&#xff09; 解析 把树剖一下后就变成了区间问题 考虑建一棵线段树&#xff0c;每一个结点都是一个背包 这样就能区间查询&#xff0c;也能带修了 这种做法复杂度其实并不…

【用皇宫三十六计生存法则带你走进LCT(动态树)】LCT概念+模板+例题【洛谷P3690 Link Cut Tree(动态树)】

文章目录LCT概念模板rotatoisrootsplayaccessmakerootsplitfindrootlinkcut封装版例题题目code普通版code封装版这篇博客主要是帮助大家理解各个模板及LCTLCTLCT的意思&#xff0c;方便理解&#xff0c;模板写法的理解在代码里有注释详解&#xff0c;如果要看原理的话&#xff…

AGC002(D~F)【Kruskal重构树,博弈论,dp】

正题 AT1998 [AGC002D] Stamp Rally【Kruskal重构树,倍增】 https://www.luogu.com.cn/problem/AT1998 题目大意 给出nnn个点mmm条边的一张无向图&#xff0c;qqq次询问两个人分别从x,yx,yx,y&#xff0c;要求总共经过zzz个点的情况下经过边的最大编号的最小值。 1≤n,m,q≤…

迈向现代化的 .Net 配置指北

1. 欢呼 .NET Standard 时代我现在已不大提 .Net Core&#xff0c;对于我来说&#xff0c;未来的开发将是基于 .NET Standard&#xff0c;不仅仅是 面向未来 &#xff0c;也是 面向过去&#xff1b;不只是 .Net Core 可以享受便利&#xff0c; .NET Framework 不升级一样能享受…

DP 套 DP

DP 套 DP 学习笔记 大致内容 DP 套 DP 就是将一个简单 DP 的状态压缩起来放到新的 DP 中当做状态进行 DP 的过程。 常用于计算简单 DP 的答案为 \(k\) 的转移方案的数量。 一般都需要 decode 和 recode 操作&#xff0c;这里和 插头DP/轮廓线DP 有异曲同工之妙&#xff01; 例题…

acwing提高组 第一章 动态规划

文章目录数字三角形模型最长上升子序列模型背包模型状态机模型状态压缩DP区间DP树形DP数位DP单调队列优化DP斜率优化DPoj链接数字三角形模型 AcWing 1015. 摘花生1357人打卡 AcWing 1018. 最低通行费1279人打卡 AcWing 1027. 方格取数1158人打卡 AcWing 275. 传纸条933人打卡 …

YBTOJ洛谷P2042:维护数列(平衡树)

文章目录题目描述解析删除区间插入数列修改&翻转区间和&最大子段和代码传送门题目描述 解析 阴间题… 这不是裸的板子吗&#xff1f; 国赛真的有人能把这题写出来吗… 应该算一道练习作用很强的题了 写完这题&#xff0c;各种平衡树维护区间操作的方法可以说是毕业了吧…

CAP 2.4版本发布,支持版本隔离特性

前言自从上次 CAP 2.3 版本发布 以来&#xff0c;已经过去了几个月的时间&#xff0c;这几个月比较忙&#xff0c;所以也没有怎么写博客&#xff0c;趁着2019年到来之际&#xff08;现在应该是2019年开始的时候&#xff09;&#xff0c;CAP也发布了2018年的最后一个大版本 2.4&…

AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】

正题 题目链接:https://www.luogu.com.cn/problem/AT2005 题目大意 开始有一个1∼n1\sim n1∼n依次排列的序列&#xff0c;然后QQQ次&#xff0c;第iii次把序列长度变为aia_iai​&#xff0c;不足的从前往后循环填充。 求最后每个数字的出现次数。 1≤n,q≤105,1≤ai≤10181…

多项式工业基础与全家桶

多项式工业基础与全家桶 开坑待填&#xff0c;放个常数巨大的板子先 别忘了这道题&#xff01;P3338 [ZJOI2014]力 #define Maxn 200005 #define mod 998244353 inline int ksm(int x,int ymod-2) {int ret1;for(;y;y>>1,x1ll*x*x%mod) if(y&1) ret1ll*ret*x%mod;ret…

【周末狂欢赛7】【NOIP模拟赛】七夕祭,齿轮(dfs),天才黑客

文章目录T1题目题解codeT2题目题解codeT3题目题解codeT1 题目 七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是TYVJ今年举办了一次线下七夕祭。Vani同学今年成功邀请到了cl同学陪他来共度七夕&#xff0c;于是他们决定去TYVJ七夕祭游玩。 TYVJ七夕祭和11区的夏祭的…

股票买卖 IV

股票买卖 IV 题意&#xff1a; 给定一个长度为 N 的数组&#xff0c;数组中的第 i 个数字表示一个给定股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润&#xff0c;你最多可以完成 k 笔交易。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再…

9.25 模拟

文章目录前言考场总结前言 260pts 100601000 线段树数组要乘4&#xff01;&#xff01;&#xff01; 结果想了一个多小时和暴力没差了。。。 呜呜呜 但总体还可以啦 T3玄学暴力竟然过掉了 告诉我们卡时的重要性 考场 先看题 T1原题啊啊啊&#xff01; 真就签到题了 感觉T2好…

Silence 主题配置代码

页面定制 import url(https://fastly.jsdelivr.net/gh/esofar/cnblogs-theme-silence3.0.0-beta3/dist/silence.min.css);media only screen and (max-width:1365px){.github-corner{display:none}}media only screen and (max-width:1259px){#home{width:100%!important}}medi…

AT3857-[AGC020C]Median Sum【背包,bitset】

正题 题目链接:https://www.luogu.com.cn/problem/AT3857 题目大意 给出nnn个数字的一个序列aaa&#xff0c;求它的所有非空子集的和的中位数。 1≤n,ai≤20001\leq n,a_i\leq 20001≤n,ai​≤2000 解题思路 考虑到假设所有数的和为SSS&#xff0c;一个集合的和为xxx&#x…

.NET Core 如何为项目提供高性能解决方案?

本系列&#xff0c;我们将探讨.NET Core 的一些好处&#xff0c;以及它如何为市场提供高性能解决方案&#xff0c;为传统.NET 开发人员和技术人员提供帮助。正文前言随着.NET Core 2.0 在 2016 年首次发布&#xff0c;微软拥有了这个通用、模块化、跨平台开源项目的下一个主要版…

1058. 股票买卖 V

1058. 股票买卖 V 题意&#xff1a; 给定一个长度为 N 的数组&#xff0c;数组中的第 i 个数字表示一个给定股票在第 i 天的价格。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: …

[2.9训练]【CF909C】Python Indentation,【CF909D】Colorful Points,【CF909E】Coprocessor

文章目录T1&#xff1a;Python Indentation题目题解codeT2&#xff1a;Colorful Points题目题解codeT3&#xff1a;Coprocessor题目题解codeT1&#xff1a;Python Indentation 题目 题目描述 In Python, code blocks don’t have explicit begin/end or curly braces to mark…

模板:2-SAT问题

文章目录前言实现代码所谓2-SAT&#xff0c;就是解决两个SAT的问题 &#xff08;逃&#xff09; 前言 SAT 是适定性&#xff08;Satisfiability&#xff09;问题的简称。一般形式为 k - 适定性问题&#xff0c;简称 k-SAT。而当 k>2 时该问题为 NP 完全的。所以我们只研究 …