牡丹江市建设银行门户网站,网页制作的公司的服务,北京西站进站最新规定,用wordpress怎么赚钱FWT 学习笔记 学的时候比较匆忙#xff0c;于是就学一个 \(\texttt{or,and,xor}\) 卷积跑路。 P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT) 前置知识#xff1a;高维前缀和#xff0c;下面前缀和的操作大多都是用高维前缀和来实现的。 设有两个长度为 \(2^n\) 的序列 … FWT 学习笔记 学的时候比较匆忙于是就学一个 \(\texttt{or,and,xor}\) 卷积跑路。 P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT) 前置知识高维前缀和下面前缀和的操作大多都是用高维前缀和来实现的。 设有两个长度为 \(2^n\) 的序列 \(A,B\)现在我们要对他们进行一下不同类型的卷积。 \(\texttt{or}\) 卷积 \[C_i\sum_{j~\texttt{or}~ki}A_j\times B_k \]考虑 \(n\) 只有 \(1\) 的情况即 \(A,B\) 的长度都只有 \(2\) 时值怎么样的 \[C_0A_0\times B_0\\ C_1A_0\times B_1A_1\times B_0A_1\times B_1\\ C_0C_1(A_0A_1)\times (B_0B_1) \]受到面式子的启发考虑将 \(A,B\) 分别进行一次前缀和每一个对应为乘起来记为 \(C\)再对 \(C\) 做一遍前缀差即可。 \(\texttt{and}\) 卷积 \[C_i\sum_{j~\texttt{and}~ki}A_j\times B_k \]仍然考虑 \(n\) 只有 \(1\) \[C_0A_0\times B_0A_0\times B_1A_1\times B_0\\ C_1A_1\times B_1\\ C_0C_1(A_0A_1)\times (B_0B_1) \]将 \(A,B\) 都做一遍后缀和按位乘起来记为 \(C\)再对 \(C\) 做一遍后缀差即可。 \(\texttt{xor}\) 卷积 \[C_i\sum_{j~\texttt{xor}~ki}A_j\times B_k \]考虑 \(n\) 只有 \(1\) \[C_0A_0\times B_0A_1\times B_1\\ C_1A_0\times B_1A_1\times B_0\\ \begin{cases} C_0C_1(A_0A_1)\times (B_0B_1)\\ C_0-C_1(A_0-A_1)\times (B_0-B_1) \end{cases} \]那么根据高维前缀和每一位相减过去即可。 模板题代码 // Author:A weak man named EricQian
#includebits/stdc.h
using namespace std;
#define infll 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define Maxn 200005
#define mod 998244353
#define pb push_back
#define pa pairint,int
#define fi first
#define se second
typedef long long ll;
inline int rd()
{int x0;char ch,t0;while(!isdigit(ch getchar())) t|ch-;while(isdigit(ch)) xx*10(ch^48),chgetchar();return xt?-x:x;
}
inline ll maxll(ll x,ll y){ return xy?x:y; }
inline ll minll(ll x,ll y){ return xy?x:y; }
inline ll absll(ll x){ return x0ll?x:-x; }
inline ll gcd(ll x,ll y){ return (y0)?x:gcd(y,x%y); }
struct FWT
{int n;inline int ksm(int x,int y){int ret1;for(;y;y1,x1ll*x*x%mod) if(y1) ret1ll*ret*x%mod;return ret;}inline void bitmul(int *a,int *b){ for(int i0;in;i) a[i]1ll*a[i]*b[i]%mod; }inline void fwt_or(int *a,int opt){for(int p2;pn;p1) for(int i0;in;ip) for(int j0;j(p1);j)(a[ij(p1)]1ll*a[ij]*opt%mod)%mod;}inline void fwt_and(int *a,int opt){for(int p2;pn;p1) for(int i0;in;ip) for(int j0;j(p1);j)(a[ij]1ll*a[ij(p1)]*opt%mod)%mod;}inline void fwt_xor(int *a,int opt){for(int p2;pn;p1) for(int i0;in;ip) for(int j0;j(p1);j){int xa[ij],ya[ij(p1)];a[ij]1ll*(xy)%mod*opt%mod;a[ij(p1)]1ll*(x-ymod)%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);nrd(),All1n,P.nAll;for(int i0;iAll;i) a[i]rd();for(int i0;iAll;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 i0;iAll;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 i0;iAll;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 i0;iAll;i) printf(%d ,A[i]);printf(\n);//fclose(stdin);//fclose(stdout);return 0;
}