题目链接:https://www.luogu.com.cn/problem/P4717
给出两个长度为2n的数列A,B求
Cn=∑i or j=nAiBj
Cn=∑i and j=nAiBj
Cn=∑i xor j=nAiBj
和FFT一样的思路,我们需要将A,B转换为点集表达式相乘再转回去,这里就直接抛结论了。
对于or有FWT(A)=(FWT(A),FWT(A)+FWT(B))
IFWT(A)=(IFWT(A),IFWT(A)−IFWT(B))
对于and有FWT(A)=(FWT(A)+FWT(B),FWT(B))
IFWT(A)=(IFWT(A)−IFWT(B),IFWT(B))
对于xor有FWT(A)=(FWT(A)+FWT(B),FWT(A)−FWT(B))
IFWT(A)=(IFWT(A)+IFWT(B)2,IFWT(A)−IFWT(B)2)
因为不用转成虚数所以代码好写很多,时间复杂度O(nlogn)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll inv2=499122177,N=(1<<18),P=998244353;
ll lg,n,aa[N],bb[N],a[N],b[N],c[3][N];
void mul(ll *c,ll *a,ll *b){
for(ll i=0;i<n;i++)
c[i]=a[i]*b[i]%P;
return;
}
void FWT_or(ll *f,ll op){
for(ll p=2;p<=n;p<<=1){
ll len=p>>1;
for(ll k=0;k<n;k+=p)
for(ll i=k;i<k+len;i++)
(f[i+len]+=f[i]*op+P)%=P;
}
return;
}
void solve_or(ll *c){
memcpy(a,aa,sizeof(a));
memcpy(b,bb,sizeof(b));
FWT_or(a,1);FWT_or(b,1);
mul(c,a,b); FWT_or(c,P-1);
return;
}
void FWT_and(ll *f,ll op){
for(ll p=2;p<=n;p<<=1){
ll len=p>>1;
for(ll k=0;k<n;k+=p)
for(ll i=k;i<k+len;i++)
(f[i]+=f[i+len]*op+P)%=P;
}
return;
}
void solve_and(ll *c){
memcpy(a,aa,sizeof(a));
memcpy(b,bb,sizeof(b));
FWT_and(a,1);FWT_and(b,1);
mul(c,a,b); FWT_and(c,P-1);
return;
}
void FWT_xor(ll *f,ll op){
for(ll p=2;p<=n;p<<=1){
ll len=p>>1;
for(ll k=0;k<n;k+=p)
for(ll i=k;i<k+len;i++){
ll x=f[i],y=f[i+len];
f[i]=(x+y)*op%P;
f[i+len]=(x-y+P)*op%P;
}
}
return;
}
void solve_xor(ll *c){
memcpy(a,aa,sizeof(a));
memcpy(b,bb,sizeof(b));
FWT_xor(a,1);FWT_xor(b,1);
mul(c,a,b); FWT_xor(c,inv2);
return;
}
signed main()
{
scanf("%lld",&lg);n=1<<lg;
for(ll i=0;i<n;i++)scanf("%lld",&aa[i]);
for(ll i=0;i<n;i++)scanf("%lld",&bb[i]);
solve_or(c[0]);
solve_and(c[1]);
solve_xor(c[2]);
for(ll i=0;i<n;i++)printf("%lld ",c[0][i]);putchar('\n');
for(ll i=0;i<n;i++)printf("%lld ",c[1][i]);putchar('\n');
for(ll i=0;i<n;i++)printf("%lld ",c[2][i]);putchar('\n');
return 0;
}
------------恢复内容开始------------
------------恢复内容结束------------
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构