[模板]FWT】的更多相关文章

写起来和fft很像,这里放个板子. 代码: #include<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<map> #include<algorithm> #include<cstring> using namespace std; #define duke(i,a,n) for(regi…
思路 FWT的模板 FWT解决这样的卷积 \[ C_k=\sum_{i\otimes j=k} A_iB_j \] \(\otimes\)可能是and,or,xor等位运算 几个式子 FWTand: \[ a[k]+=a[k+len] \] IFWTand: \[ a[k]-=a[k+len] \] FWTor: \[ a[k+len]+=a[k] \] IFWTor: \[ a[k+len]-=a[k] \] FWTxor: \[ x=a[k]\\ y=a[k+len]\\ a[k]=x+y\…
洛谷题目传送门 只是一个经过了蛇皮压行的模板... 总结?%%%yyb%%% #include<bits/stdc++.h> #define LL long long #define RG register #define R RG int #define G if(++ip==ie)fread(ip=buf,1,S,stdin) #define For \ R i,j,k,d; \ for(i=2;i<=N;i<<=1) \ for(d=i>>1,j=0;j&l…
点此看题面 大致题意: 有两个长度为\(2^n\)的数组\(A,B\),且\(C_i=\sum_{j⊕k==i}A_jB_k\)分别求出当\(⊕\)为\(or,and,xor\)时的\(C\)数组. \(FWT\) 这是一道\(FWT\)的板子题. 由于\(FWT\)太难了,所以我只会背板子(甚至连板子都不会背). 可见代码. 代码 #include<bits/stdc++.h> #define Tp template<typename Ty> #define Ts templat…
FWT在三种位运算下都满足FWT(a×b)=FWT(a)*FWT(b) 其中or卷积和and卷积还可以通过FMT实现(本质上就是个高维前缀和) #include<bits/stdc++.h> #define N 1100000 #define eps 1e-7 #define inf 1e9+7 #define db double #define ll long long #define ldb long double using namespace std; inline int read(…
https://www.cnblogs.com/RabbitHu/p/9182047.html 完全没有学证明的欲望因为这个实在太好写了而且FFT就算学过也忘得差不多了只会写板子 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std;…
FWT求解的是一类问题:\( a[i] = \sum\limits_{j\bigoplus k=i}^{} b[j]*c[k] \) 其中,\( \bigoplus \) 可以是 or,and,xor 三种问题的解决思路都是对多项式 \( a \) 构造一个 \( a' \),令 \( a' = b' * c' \): 那么只需要把 \( b \) 变换成 \( b' \),\( c \) 变换成 \( c' \),然后乘出 \( a' \),再逆变换得到 \( a \): 下面问题就变成如何快…
void nnt(int a[],int len,int on) { ;i<len;i++) if(i<r[i]) swap(a[i],a[r[i]]); ;i<len;i<<=) { ,(mod-)/(i<<)); ;j<len;j+=(i<<)) { ; ;k<i;k++,w=1ll*w*wn%mod) { int u=a[j+k], v=1ll*w*a[j+k+i]%mod; a[j+k]=(u+v)%mod, a[j+k+i]=(u…
代码来自51nod1570 #include<cstdio> #include<cstring> #include<algorithm> #define MN 501 using namespace std; int read_p,read_ca; inline int read(){ read_p=;read_ca=getchar(); ') read_ca=getchar(); +read_ca-,read_ca=getchar(); return read_p;…
题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> //#define gc() getchar() #define MAXIN 300000 #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,M…
题意 题目链接 Sol 背板子背板子 #include<bits/stdc++.h> using namespace std; const int MAXN = (1 << 17) + 10, mod = 998244353, inv2 = 499122177; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {if(c == '-') f = -1;…
传送门 这玩意儿太骚了…… 参考了yyb巨佬的 //minamoto #include<iostream> #include<cstdio> #define ll long long #define add(x,y) ((x+=y)>=mod?x-=mod:x) using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF…
#include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se secon…
1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int maxn=1e6; ],b[maxn+]; ]; int len1,len2,t; int main() { scanf("%d\n",&t); while(t) { --t; scanf("%s%s",b,a);//a是母串 b是匹配串 l…
虽然这个队,以后再也没有了,但是他的模板,是永垂不朽的![误 #include <ext/pb_ds/priority_queue.hpp> __gnu_pbds::priority_queue < int > Q; 优先队列,配对堆默认,从小到大! __gnu_pbds::priority_queue < int , greater < int > , pairing_heap_tag > Q; __gnu_pbds::priority_queue <…
先简短几句话说说FFT.... 多项式可用系数和点值表示,n个点可确定一个次数小于n的多项式. 多项式乘积为 f(x)*g(x),显然若已知f(x), g(x)的点值,O(n)可求得多项式乘积的点值. 我们所需要的就是O(nlogn)快速地将两个系数多项式表示成点值多项式,O(n)求得乘积的点值表示后O(nlogn)还原成系数多项式. 这里就需要套FFT板子了... FFT中取n个单位根,需要n是2的幂. 又因为n个点可确定一个次数小于n的多项式,所以n > 乘积多项式的最高次数. 以上. HD…
在多项式卷积的处理中,我们实际上实现的是下面的一个式子 \[ C_k=\sum_{i+j=k}A_iB_j \] 然而事实上有些和(sang)蔼(xin)可(bing)亲(kuang)的出题人,并不会让你直接求这样的式子,比如把+换成-什么的 但是更多时候,你拿到手上的却是这样一个式子 \[ C_k=\sum_{i\bigoplus j=k}A_iB_j \] 其中\(\bigoplus\)可能是\(or,and,xor\)中的一种或多种 那么现在我们就会使用FWT(快速沃尔什变化)来优化时间复…
目录 计算几何✔ DP 斜率优化✔ 四边形不等式✔ 轮廓线DP✘ 各种分治 CDQ分治✔ 点分治✔ 整体二分✔ 数据结构 线段树合并✔ 分块✔ K-D Tree LCT 可持久化Trie✔ Splay fhq Treap 虚树 可并堆 左偏树* 数学,数论 CRT 扩展CRT Lucas 扩展Lucas 杜教筛✔ Min25筛 莫比乌斯反演✔ FFT,NTT FWT BSGS Miller Rabin* Pollard Rho* Catalan数 Stirling数 高斯消元 拉格朗日插值✔ 单…
解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先转化成为另一个多项式$FWT(A),FWT(B)$ 使得:$FWT(A\oplus B)=FWT(A)×FWT(B)$ 这里,$×$是按位乘.这个是$O(n)$的. 然后,再$IFWT$回去即可. 类似于,直接过马路不好走.先从左边走上一座天桥,再从天桥走过去,再到马路右侧走下天桥. 就变成了$O(…
目录 信号, 集合, 多项式, 以及卷积性变换 卷积 卷积性变换 傅里叶变换与信号 引入: 信号分析 变换的基础: 复数 傅里叶变换 离散傅里叶变换 FFT 与多项式 \(n\) 次单位复根 消去引理, 折半引理与求和引理 重新定义 多项式的表示 快速傅里叶变换FFT 通过 FFT 在单位复数根处插值 FFT的速度优化与迭代实现 炸精现场与 NTT 原根 NTT 任意模数 NTT 卷积状物体与分治 FFT FWT 与位运算卷积 FWT 与 \(\text{or}\) 卷积 FWT 与 \(\te…
这是我第一道独立做出来的FWT的题目,所以写篇随笔纪念一下. (这还要纪念,我太弱了) 题目链接: BZOJ 题目大意:两人玩nim游戏(多堆石子,每次可以从其中一堆取任意多个,不能操作就输).$T$ 组数据,现在问如果 $n$ 堆石子,每堆石子个数都是不超过 $m$ 的素数,有多少种不同的石子序列使得先手没有必胜策略,答案对 $10^9+7$ 取模.(石子堆顺序不同也算不同) $1\leq T\leq 80,1\leq n\leq 10^9,1\leq m\leq 5\times 10^4$.…
放模板 #include<bits/stdc++.h> #define N 100005 using namespace std; const int p = 1000000007; int t,n,m,ni; int pw(int x,int y) { int lst=1; while(y) { if(y&1)lst=1LL*lst*x%p; y>>=1; x=1LL*x*x%p; } return lst; } int pr[N],su[N],tot,a[N]; voi…
实在是 美丽的数学啊 关于傅里叶变换的博客 讲的很细致 图片非常易于理解http://blog.jobbole.com/70549/ 大概能明白傅里叶变换是干吗的了 但是还是不能明白为什么用傅里叶变换来算多项式求和 在多项式中,DFT就是系数表式转换成点值表示的过程. 我们熟知的是多项式的系数表示法,通过给定一组  来确定一个唯一的多项式: 而多项式还可以有另一种表示法,称为点值表示法: 其中 可以证明,对一组互不相同的该方法也可以唯一地表示一个多项式. 为什么要引入点值表示法这个并不"直观&q…
题目链接 CSU1911 题解 FWT模板题 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<map> #define LL long long in…
题目链接 BZOJ4589 题解 FWT 模板题 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<cmath> #include<map> #define LL long long…
很裸的子集反演模板题,套上一些莫名其妙的外衣. 先预处理每个集合是否合法,再作显然的状压DP.然后发现可以写成子集反演的形式,直接套模板即可. 子集反演可以看这里. 子集反演的过程就是多设一维代表集合大小,再FMT处理集合并卷积. 然而我的FMT常数过大,而并卷积又可以用FWT实现,于是就写FWT了.(实际上就三行的区别) #include<cstdio> #include<algorithm> #include<cstring> #define rep(i,l,r)…
[CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\)的方案数. 题解 \(FWT\)的模板题 \(FWT\)写起来是真的舒服 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath>…
马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string.h> # include <iostream> # include <algorithm> // # include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long dou…
题目:https://www.luogu.org/problemnew/show/P4106 https://www.lydsy.com/JudgeOnline/problem.php?id=3614 可以先把给出的东西排序成这样: -1 -1 -1 -1 -1  1 -1  1 -1 -1  1  1 1 -1 -1 1 -1  1 1  1 -1 1  1  1 就是后面看成低位.前面看成高位,1看成1.-1看成0的二进制的顺序. 发现把第1行和第2行相加再除以2,得到的就是与 x3 无关的…
概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x)  即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^{'}[i]*b^{'}[i] \). 只要知道 c'[ i ] 和 c[ i ] 的关系,就能把 A(x).B(x) 变成 A'(x).B'(x) ,从而算出 C'(x) ,再把 C'(x) 变成 C(x). 或卷积 定义\( c^{'}[i]=\sum\limits_{j | i=i} c[j]…