洛谷P4717 【模板】快速沃尔什变换(FWT)
2024-09-30 04:11:34
这玩意儿太骚了……
参考了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:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]=' ';
}
const int N=(<<)+,mod=,inv=;
int n,len,A[N],B[N],R[N];
void FWT_or(int *A,int type){
for(int i=;i<len;i<<=)
for(int p=i<<,j=;j<len;j+=p)
for(int k=;k<i;++k)
add(A[i+j+k],type==?A[j+k]:mod-A[j+k]);
}
void FWT_and(int *A,int type){
for(int i=;i<len;i<<=)
for(int p=i<<,j=;j<len;j+=p)
for(int k=;k<i;++k)
add(A[j+k],type==?A[i+j+k]:mod-A[i+j+k]);
}
void FWT_xor(int *A,int type){
for(int i=;i<len;i<<=)
for(int p=i<<,j=;j<len;j+=p)
for(int k=;k<i;++k){
int x=A[j+k],y=A[i+j+k];
A[j+k]=(x+y)%mod,A[i+j+k]=(x+mod-y)%mod;
if(type==-) A[j+k]=1ll*A[j+k]*inv%mod,A[i+j+k]=1ll*A[i+j+k]*inv%mod;
}
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),len=<<n;
for(int i=;i<len;++i) A[i]=read();
for(int i=;i<len;++i) B[i]=read(); FWT_or(A,),FWT_or(B,);
for(int i=;i<len;++i) R[i]=1ll*A[i]*B[i]%mod;
FWT_or(A,-),FWT_or(B,-),FWT_or(R,-);
for(int i=;i<len;++i) print(R[i]);sr[++C]='\n'; FWT_and(A,),FWT_and(B,);
for(int i=;i<len;++i) R[i]=1ll*A[i]*B[i]%mod;
FWT_and(A,-),FWT_and(B,-),FWT_and(R,-);
for(int i=;i<len;++i) print(R[i]);sr[++C]='\n'; FWT_xor(A,),FWT_xor(B,);
for(int i=;i<len;++i) R[i]=1ll*A[i]*B[i]%mod;
FWT_xor(R,-);
for(int i=;i<len;++i) print(R[i]);sr[++C]='\n'; Ot();
return ;
}
最新文章
- js整理
- 2016中国大学生程序设计竞赛 - 网络选拔赛 J. Alice and Bob
- Hadoop深入浅出实战经典–第02讲
- 【转】 Newtonsoft.Json高级用法
- centos7下彻底卸载LibreOffice方法【转载】
- 如何根据iframe内嵌页面调整iframe高宽续篇
- weblogic11g 节点管理器 nodemanager
- java基本类型作为成员变量时的初始值
- Java 7源码分析第13篇 - 字节输入输出流(1)
- oracle如何修改字段类型(oracle总体知识2)
- python语言学习9——使用list和tuple
- 【百度地图API】情人节求爱大作战——添加标注功能
- Linux 监控文件事件
- Redis的发布订阅及.NET客户端实现
- 我眼中的微信小程序
- 关于ES5的indexof()和ES7的includes()的区别
- selenium中隐式等待和显示等待的区别
- bzoj3678 Katu Puzzle
- Burpsuite 之intruder
- HDFS的Java客户端编写