CF1119H-Triple【FWT】
正题
题目链接:https://www.luogu.com.cn/problem/CF1119H
题目大意
\(n\)个可重集,第\(i\)个里有\(x\)个\(a_i\),\(y\)个\(b_i\),\(z\)个\(c_i\)。
对于每个\(t\in[0,2^k)\)求每个集合里取出一个数使它们异或起来等于\(t\)的方案数。
解题思路
如果直接\(n\)个东西\(FWT\)起来肯定过不了,我们需要根据每个集合里只有三种数这个性质来优化。
因为是\(xor\)卷积,所以第\(i\)个位置\(FWT\)之后对\(j\)造成的影响是\((-1)^{cnt(i\&j)}\)(其中\(cnt(x)\)表示\(x\)在二进制下\(1\)的个数)
那么就有
\]
现在我们就可以单独考虑每个\(x,y,z\)的贡献了,然后每个\(FWT(S_i)[j]\)有\(8\)个状态,为了方便我们缩减一下状态先。
首先我们先让所有的\(x\)都取到,也就是让所有的\(b_i=b_i\ xor\ a_i,c_i=c_i\ xor\ a_i\),然后询问答案的时候我们再异或上一个\(a\)的异或和即可。
现在每个\(FWT(S_i)[j]\)有\(4\)种状态,分别是\((x+y+z),(x+y-z),(x-y+z),(x-y-z)\)。定义这些状态数量分别为\(a_1,a_2,a_3,a_4\)
我们先考虑集合\(i\)的每种状态中\(y\)的影响\(F_i\),有\(F_i[k]=cnt(k\& a_i)\),而所有集合的影响和就是\(\sum_{i=1}^nF_i\)。设\(G_i=IFWT(F_i)\)那么显然有\(G_i[b_i]=1\)其他都为\(0\)。
然后影响和就是
\]
所以直接把\(G\)都加起来然后\(FWT\)就好了,定义\(y\)的影响为\(c_1\)。
然后再同理搞出\(z\)和\(y+z\)的影响,分别为\(c_2,c_3\),那么就有方程组
a_1+a_2+a_3+a_4=n\\
a_1+a_2-a_3-a_4=c_1\\
a_1-a_2+a_3-a_4=c_2\\
a_1-a_2-a_3+a_4=c_3
\end{matrix}\right.\]
解出来就好了,然后用快速幂算出来\(F=\prod_{i=1}^nFWT(S_i)\),求一遍\(IFWT(F)\)即可。
时间复杂度\(O(\ 2^kk+n\log(x+y+z)\ )\)
\(code\)
#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;
}
CF1119H-Triple【FWT】的更多相关文章
- LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】
题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...
- hdu6057 Kanade's convolution 【FWT】
题目链接 hdu6057 题意 给出序列\(A[0...2^{m} - 1]\)和\(B[0...2^{m} - 1]\),求所有 \[C[k] = \sum\limits_{i \; and \; ...
- CSU1911 Card Game 【FWT】
题目链接 CSU1911 题解 FWT模板题 #include<algorithm> #include<iostream> #include<cstdlib> #i ...
- BZOJ4589 Hard Nim 【FWT】
题目链接 BZOJ4589 题解 FWT 模板题 #include<algorithm> #include<iostream> #include<cstdlib> ...
- [JZOJ6088] [BZOJ5376] [loj #2463]【2018集训队互测Day 1】完美的旅行【线性递推】【多项式】【FWT】
Description Solution 我们考虑将问题一步步拆解 第一步求出\(F_{S,i}\)表示一次旅行按位与的值为S,走了i步的方案数. 第二步答案是\(F_{S,i}\)的二维重复卷积,记 ...
- 【杂题】[AGC034F] RNG and XOR【集合幂级数】【FWT】【DP】
Description 你有一个随机数生成器,它会以一定的概率生成[0,2^N-1]中的数,每一个数的概率是由序列A给定的,Pi=Ai/sum(Ai) 现在有一个初始为0的数X,每一轮随机生成一个数v ...
- CF662C Binary Table【FWT】
CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\ ...
- bzoj4589-Hard Nim【FWT】
正题 题目链接:https://darkbzoj.tk/problem/4589 题目大意 求有多少个长度为\(n\)的数列满足它们都是不大于\(m\)的质数且异或和为\(0\). 解题思路 两个初始 ...
- hdu5909-Tree Cutting【FWT】
正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5909 题目大意 给出\(n\)和\(m\)(\(m=2^k\)).再给出一个大小为\(n\)的树 ...
随机推荐
- Java 方法使用
那么什么是方法呢? Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 方法的优点 1. 使程序变得更简 ...
- C# 对SQlServer访问的完整类
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.C ...
- JavaSE-Java基础面试题
重载与重写的区别 重载:本类中,方法名相同,参数列表不同,(参数类型.参数顺序.参数个数),返回值类型可以不同,访问修饰符可不同 重写:子类中,方法名相同,参数不能改,返回值类型一致或其子类,访问权限 ...
- MySQL-后知知觉的索引
什么是索引? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能 非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重 ...
- Linux CentOS7 安装配置 IPtables
2021-08-11 1. 前言 防火墙其实就是实现 Linux 下访问控制功能的,分为硬件和软件的防火墙两种类型.无论在何网络中,防火墙工作的地方一定是网络的边缘.防火墙的策略.规则就是去定义防火墙 ...
- Redis实现主从复制以及sentinel的配置
redis 是一个高性能的 key-value 数据库. redis 的出现,很大程度补偿了 memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很 好的补充作用.它 ...
- GUI编程路线
基本路线
- vue2+vite初体验
前言 自从 vite 发布之后,社区赞誉无数,而我也一直心水 vite 的轻量快速的热重载的特性,特别是公司的项目巨大,已经严重拖慢了热重载的速度了,每次热重载都要等上一小会,所以急需寻找一个解决方案 ...
- 浅谈 JVM GC 的安全点与安全区域
OopMap 前文我们说到,JVM 采用的可达性分析法有个缺点,就是从 GC Roots 找引用链耗时. 都说他耗时,他究竟耗时在哪里? GC 进行扫描时,需要查看每个位置存储的是不是引用类型,如果是 ...
- vim编辑器设置
由于ubantu自带的vi编辑器并不好用,而开发一般使用vim编辑器,vim需要自己安装(sudo apt-get install vim 即可安装),但是默认的设置使用起来很不舒服,因此可以通过修改 ...