FWT板子
板子:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = ;
const int MOD = ;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n;
ll inv_2=(MOD+)/;
ll a[(<<N)+],b[(<<N)+],c[(<<N)+];
void Mod(ll&x){if(x>=MOD)x-=MOD;}
void fwt_or(ll *a,int len,int k)
{
for(int i=;i<len;i<<=)
for(int j=;j<len;j+=(i<<))
for(int o=;o<i;o++)
{
if(k==)Mod(a[j+o+i]+=a[j+o]);
else Mod(a[j+o+i]+=-a[j+o]+MOD);
}
}
void fwt_and(ll *a,int len,int k)
{
for(int i=;i<len;i<<=)
for(int j=;j<len;j+=(i<<))
for(int o=;o<i;o++)
{
if(k==)Mod(a[j+o]+=a[j+o+i]);
else Mod(a[j+o]+=-a[j+o+i]+MOD);
}
}
void fwt_xor(ll *a,int len,int k)
{
for(int i=;i<len;i<<=)
for(int j=;j<len;j+=(i<<))
for(int o=;o<i;o++)
{
int w1 = a[j+o],w2 = a[j+o+i];
a[j+o] = (w1+w2)%MOD;
a[j+o+i] = (w1-w2+MOD)%MOD;
if(k==-)a[j+o]=a[j+o]*inv_2%MOD,a[j+o+i]=a[j+o+i]*inv_2%MOD;
}
}
void mul()
{
for(int i=;i<(<<n);i++)
c[i] = a[i]*b[i]%MOD;
}
void print()
{
for(int i=;i<(<<n);i++)
printf("%lld ",c[i]);
puts("");
}
int main()
{
read(n);int len = (<<n);
for(int i=;i<len;i++)
read(a[i]);
for(int i=;i<len;i++)
read(b[i]);
fwt_or(a,len,),fwt_or(b,len,);
mul();
fwt_or(c,len,-);
print();
fwt_or(a,len,-),fwt_or(b,len,-);
fwt_and(a,len,),fwt_and(b,len,);
mul();
fwt_and(c,len,-);
print();
fwt_and(a,len,-),fwt_and(b,len,-);
fwt_xor(a,len,),fwt_xor(b,len,);
mul();
fwt_xor(c,len,-);
print();
fwt_xor(a,len,-),fwt_xor(b,len,-);
return ;
}
FWT板子的更多相关文章
- 能轻松背板子的FWT(快速沃尔什变换)
FWT应用 我不知道\(FWT\)的严格定义 百度百科和维基都不知道给一坨什么****东西** FWT(Fast Walsh Fransform),中文名快速沃尔什变换 然后我也不知道\(FWT\)到 ...
- bzoj4589: Hard Nim fwt
题意:求n个m以内的素数亦或起来为0的方案数 题解:fwt板子题,先预处理素数,把m以内素数加一遍(下标),然后fwt之后快速幂即可,在ifwt之后a[0]就是答案了 /*************** ...
- Noip前的大抱佛脚----数论
目录 数论 知识点 Exgcd 逆元 gcd 欧拉函数\(\varphi(x)\) CRT&EXCRT BSGS&EXBSGS FFT/NTT/MTT/FWT 组合公式 斯特林数 卡塔 ...
- 【51nod】1773 A国的贸易
题解 FWT板子题 可以发现 \(dp[i][u] = \sum_{i = 0}^{N - 1} dp[i - 1][u xor (2^i)] + dp[i - 1][u]\) 然后如果把异或提出来可 ...
- 卷积FFT、NTT、FWT
先简短几句话说说FFT.... 多项式可用系数和点值表示,n个点可确定一个次数小于n的多项式. 多项式乘积为 f(x)*g(x),显然若已知f(x), g(x)的点值,O(n)可求得多项式乘积的点值. ...
- CF914G Sum the Fibonacci FWT、子集卷积
传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...
- FWT快速沃尔什变换学习笔记
FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...
- 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...
- [学习笔记&教程] 信号, 集合, 多项式, 以及各种卷积性变换 (FFT,NTT,FWT,FMT)
目录 信号, 集合, 多项式, 以及卷积性变换 卷积 卷积性变换 傅里叶变换与信号 引入: 信号分析 变换的基础: 复数 傅里叶变换 离散傅里叶变换 FFT 与多项式 \(n\) 次单位复根 消去引理 ...
随机推荐
- POJ2488【DFS】
阿西吧,搞清楚谁是行,谁是列啊!!! #include <stdio.h> #include <string.h> #include <math.h> #inclu ...
- c# 异常找不到源代码的情况
简单说下原因,调用的是dynamic参与的函数 dynamic dataqueue = pi.GetValue(this,null); var eo = ErrorObject.True; var v ...
- 常用JSTL标签
1.判断是否为空 <c:choose> <c:when test="${not empty reportInfo.user_register_orgs.register_o ...
- 洛谷p2234/BZOJ1588 [HNOI2002]营业额统计
题目链接: 洛谷 BZOJ 分析: 好像没有什么好说的就是一个平衡树的板子--唯一要注意的就是这里要找的并不是严格的前驱和后继,因为如果找到之前某一天的营业额和它相等那么差就是0,所以我们仍然在结构体 ...
- 洛谷 P1445 [Violet]樱花
#include<cstdio> #include<algorithm> #include<cstring> #include<vector> usin ...
- 自己写的MD5加密原码
package com.wh.md5; import java.security.MessageDigest; import java.util.Arrays; /** * @author 王恒 * ...
- 把AM_B_ENTRY表里的ARCHIVAL_CODE字段,值复制给BA_ARCHIVAL_CODE_160812字段
UPDATE AM_B_ENTRY T SET T.BA_ARCHIVAL_CODE_160812=T.ARCHIVAL_CODE SELECT BA_ARCHIVAL_CODE_160812 FRO ...
- Elasticsearch (1) - 索引库 文档 分词
创建索引库 ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档.它就相当于MySQL中的表,或相当于Mongodb中的集合. 关于索引这个语: 索引(名词):E ...
- P3368 【模板】树状数组 2 单点查询与区间修改
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- viewport实现html页面动态缩放/meta viewport/viewport
页面默认缩放比例为1,最小宽度为375px,在小于375px出现水平滚动条的时候重新计算显示比例缩小界面, <!DOCTYPE html> <html lang="en&q ...