题目链接:https://www.luogu.com.cn/problem/CF1119H
n个可重集,第i个里有x个ai,y个bi,z个ci。
对于每个t∈[0,2k)求每个集合里取出一个数使它们异或起来等于t的方案数。
如果直接n个东西FWT起来肯定过不了,我们需要根据每个集合里只有三种数这个性质来优化。
因为是xor卷积,所以第i个位置FWT之后对j造成的影响是(−1)cnt(i&j)(其中cnt(x)表示x在二进制下1的个数)
那么就有
FWT(Si)=2k−1∑i=1(−1)cnt(j&ai)x+(−1)cnt(j&bi)y+(−1)cnt(j&bi)z
现在我们就可以单独考虑每个x,y,z的贡献了,然后每个FWT(Si)[j]有8个状态,为了方便我们缩减一下状态先。
首先我们先让所有的x都取到,也就是让所有的bi=bi xor ai,ci=ci xor ai,然后询问答案的时候我们再异或上一个a的异或和即可。
现在每个FWT(Si)[j]有4种状态,分别是(x+y+z),(x+y−z),(x−y+z),(x−y−z)。定义这些状态数量分别为a1,a2,a3,a4
我们先考虑集合i的每种状态中y的影响Fi,有Fi[k]=cnt(k&ai),而所有集合的影响和就是∑ni=1Fi。设Gi=IFWT(Fi)那么显然有Gi[bi]=1其他都为0。
然后影响和就是
n∑i=1FWT(Gi)=FWT(n∑i=1Gi)
所以直接把G都加起来然后FWT就好了,定义y的影响为c1。
然后再同理搞出z和y+z的影响,分别为c2,c3,那么就有方程组
⎧⎪
⎪
⎪⎨⎪
⎪
⎪⎩a1+a2+a3+a4=na1+a2−a3−a4=c1a1−a2+a3−a4=c2a1−a2−a3+a4=c3
解出来就好了,然后用快速幂算出来F=∏ni=1FWT(Si),求一遍IFWT(F)即可。
时间复杂度O( 2kk+nlog(x+y+z) )
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2e5+10,P=998244353;
const ll inv2=(P+1)/2;
ll n,k,x,y,z,xs;
ll f1[N],f2[N],f3[N],f[N];
ll power(ll x,ll b){
ll ans=1;x%=P;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void FWT(ll *f,ll n,ll op){
for(ll p=2;p<=n;p<<=1)
for(ll k=0,len=p>>1;k<n;k+=p)
for(ll i=k;i<k+len;i++){
ll x=f[i],y=f[i+len];
if(op==1){
f[i]=x+y;
f[i+len]=x-y;
}
else{
f[i]=(x+y)*inv2%P;
f[i+len]=(x-y)*inv2%P;
}
}
return;
}
signed main()
{
scanf("%lld%lld",&n,&k);k=1<<k;
scanf("%lld%lld%lld",&x,&y,&z);
for(ll i=1;i<=n;i++){
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
xs^=a;b^=a;c^=a;
f1[b]++;f2[c]++;f3[b^c]++;
}
FWT(f1,k,1);FWT(f2,k,1);FWT(f3,k,1);
for(ll i=0;i<k;i++){
ll c1=f1[i],c2=f2[i],c3=f3[i];
ll a1,a2,a3,a4;
a4=(c3-c1-c2+n)/4;
a3=-(c1-n+2ll*a4)/2;
a2=-(c2-n+2ll*a4)/2;
a1=n-a2-a3-a4;
f[i]=power(x+y+z,a1)%P*power(x+y-z,a2)%P;
f[i]=f[i]*power(x-y+z,a3)%P*power(x-y-z,a4)%P;
}
FWT(f,k,-1);
for(ll i=0;i<k;i++)
printf("%lld ",(f[i^xs]+P)%P);
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语句:使用策略模式优化代码结构