题目传送门

题目大意

给出\(n,t,x,y,z\),值域\(\le 2^t\),给出\(n\)个三元组\((a_i,b_i,c_i)\),表示有\(x\)个\(a_i\),\(y\)个\(b_i\),\(z\)个\(c_i\)。对于每个\(k\in [0,2^t-1]\),求出从每组选出一个数的异或值为\(k\)的方案数。

思路

先定义\([\delta ^n]F(\delta)\)表示多项式\(F\)的第\(n\)位系数。

不得不说,这道题真的很妙。而且也加深了我对FWT的理解。

如果我们对每个三元组创建生成函数为:

\[F_i(\delta )=x\delta^{a_i}+y\delta^{b_i}+z\delta ^{c_i}
\]

那么对于\(k\)的答案就是:

\[[\delta^k]\prod_{i=1}^{n} F_i(\delta)
\]

这里的乘法定义为异或卷积,就是\([\delta^n]F(\delta) G(\delta)=\sum_{i\otimes j=n} [\delta^i] F(\delta) [\delta^j] G(\delta)\)。

可以看出来,上面这个式子可以使用\(\text {FWT}\)进行优化,但是\(\Theta(nk2^k)\)的时间复杂度显然通过不了这道题。

但是这道题十分特殊,因为每个多项式只有\(3\)个点有值。于是,我们可以考虑在\(\text {FWT}\)的过程中进行优化。

我们可以考虑到,对于\([\delta^i]FWT(F_n)\)有

\[[\delta^i]FWT(F_n)=(-1)^{cnt(i \wedge a_n)}x+(-1)^{cnt(i\wedge b_n)}y+(-1)^{cnt(i\wedge c_n)}z
\]

其中,\(cnt(i)\)表示\(i\)在二进制下\(1\)的个数。

如果我们按照上面的构造的话,时间复杂度虽然降为\(\Theta((n+k)2^k)\),但是仍然无法通过。

但是我们发现对于\([\delta^i]FWT(F_n)\),它的值只可能有\(8\)种,形式为\(x+y+z,x+y-z,...\)。于是,我们可以自然地想到一种方法,即计算对于\([\delta ^i]\prod FWT(F_n)\)每一种出现了多少次,然后直接快速幂即可。

但是\(8\)种显然太多了,我们可以通过把一个三元组\((a_i,b_i,c_i)\)变为\((0,b_i\otimes a_i,c_i\otimes a_i)\),最后答案再异或上\(\otimes_{i=1}^{n} a_i\)。这样我们就只有\(4\)种情况了。

为了方便,我们设\(S =\prod_{i=1}^{n} FWT(F_i)\)。这里的乘法就是\([\delta^i]F(\delta) G(\delta) =[\delta^i]F(\delta) [\delta^i]G(\delta)\)。我们对于\([\delta^i]S\)可以设\(c1,c2,c3,c4\)表示:

\[[\delta^i]S=(x+y+z)^{c1} (x+y-z)^{c2}(x-y+z)^{c3}(x-y-z)^{c4}
\]

于是,我们的目标就是通过设立\(4\)个本质不同的一次方程解出\(c1,c2,c3,c4\)。

首先,非常显然:

\[c1+c2+c3+c4=n\ \ \ \ \ \ \ \ \ \ \ (1)
\]

然后呢?我们发现其实\(c1,c2,c3,c4\)跟\(x,y,z\)其实半毛钱都没有,于是我们可以对\(x,y,z\)代入特定值解出\(c1,c2,c3,c4\)。

  • \(x=0,y=1,z=0\)

这样,我们就可以得到:

\[\sum_{j=1}^{n} FWT(F_j)[\delta^i]=p1=c1+c2-c3-c4\ \ \ \ \ \ \ \ \ (2)
\]

非常显然,你把\(x=0,y=1,z=0\)带进去就好了。

  • \(x=0,y=0,z=1\)

与上面一样,我们可以得到:

\[\sum_{j=1}^{n} FWT(F_j)[\delta ^i]=p2=c1-c2+c3-c4\ \ \ \ \ \ (3)
\]

但是我们现在似乎只有\(3\)个方程。。。蛤?你说\(x=1,y=0,z=0\),显然它与\((1)\)式本质相同。

于是,我们现在需要一点大大的脑洞。

  • \([\delta^{b_k\otimes c_k}]F(\delta)=1\)

我们发现这种情况其实就是上面两种情况的卷积,就可以得到:

\[[\delta^i] FWT(F_k)=(-1)^{cnt(i\wedge b_k)}(-1)^{cnt(i\wedge c_k)}
\]

于是,我们可以得到:

\[\sum_{k=1}^{n} FWT(F_k)[\delta^i]=p3=c1-c2-c3+c4\ \ \ \ \ \ (4)
\]

于是,我们就可以得到:

\[\left\{\begin{array}{l}
c1+c2+c3+c4=n\\
c1+c2-c3-c4=p1\\
c1-c2+c3-c4=p2\\
c1-c2-c3+c4=p3
\end{array}\right.\]
\[\Rightarrow \left\{\begin{array}{l}
c1=\frac{n+p1+p2+p3}{4}\\
c2=\frac{n+p1-2c1}{2}\\
c3=\frac{n+p2-2c1}{2}\\
c4=\frac{n+p3-2c1}{2}
\end{array}\right.
\]

于是,我们就可以在\(\Theta(n+k2^k)\)时间内解决。

\(\text {Code}\)


#include <bits/stdc++.h>
using namespace std; #define Int register int
#define inv2 499122177
#define mod 998244353
#define int long long template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} int quick_pow (int a,int b){
int res = 1;
while (b){
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
int inv (int x){return quick_pow (x,mod - 2);} int n,t,lim,f[1 << 17],f1[1 << 17],f2[1 << 17],f3[1 << 17]; void DWT (int *a){
for (Int i = 1;i < lim;i <<= 1)
for (Int j = 0;j < lim;j += i << 1)
for (Int k = 0;k < i;++ k){
int x = a[j + k],y = a[j + k + i];
a[j + k] = x + y,a[i + j + k] = x - y;
}
} void IDWT (int *a){
for (Int i = 1;i < lim;i <<= 1)
for (Int j = 0;j < lim;j += i << 1)
for (Int k = 0;k < i;++ k){
int x = a[j + k],y = a[j + k + i];
a[j + k] = (x + y) * inv2 % mod,a[i + j + k] = (x + mod - y) * inv2 % mod;
}
} signed main(){
read (n,t),lim = 1 << t;int x,y,z,sta = 0;read (x,y,z);
for (Int i = 1,a,b,c;i <= n;++ i) read (a,b,c),sta ^= a,b ^= a,c ^= a,f1[b] ++,f2[c] ++,f3[b ^ c] ++;
DWT (f1),DWT (f2),DWT (f3);
int s1 = (x + y + z) % mod,s2 = (x + y - z) % mod,s3 = (x - y + z) % mod,s4 = (x - y - z) % mod;
for (Int i = 0;i < lim;++ i){
int c1 = (n + f1[i] + f2[i] + f3[i]) / 4;
f[i] = quick_pow (s1,c1) *
quick_pow (s2,(n + f1[i] - c1 * 2) / 2) % mod *
quick_pow (s3,(n + f2[i] - c1 * 2) / 2) % mod *
quick_pow (s4,(n + f3[i] - c1 * 2) / 2) % mod;
}
IDWT (f);
for (Int i = 0;i < lim;++ i) write ((f[i ^ sta] + mod) % mod),putchar (' ');
putchar ('\n');
return 0;
}

参考博客

https://www.luogu.com.cn/blog/command-block/solution-cf1119h

题解 CF1119H Tripe题解的更多相关文章

  1. 小埋的Dancing Line之旅:比赛题解&热身题题解

    答疑帖: 赞助团队:UMR IT Team和洛谷大佬栖息地 赛后题解:更新了那两道练手题的题解 赛时公告,不过一些通知也可能在团队宣言里发出 如果各位发现重题,请将你认为重复的题目链接连同这次比赛的题 ...

  2. Codeforces Round #545 Div1 题解

    Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...

  3. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  4. 题解 P1308 【统计单词数】

    小金羊发一篇不一样的题解: 这个题解不是讲解法的,是讲算法的... 众所周知,string在中被定义为是类型, 这意味着我们可以将它作为int一样的类型使用. 并且还有神奇的加减法: string s ...

  5. SCOI2014极水的题解- -

    话说SCOI都考了1个月了,终于拿出决心把题解补完了,但都说了是极水的题解,大家就看着玩吧- - DAY1 T1:目标是找最长不降子序列,先就有一个比较显然的结论,就是假如我们要拔高区间[L, R], ...

  6. 【题解】51nod 1672区间交

    二分答案 + two - pointer + 树状数组大法好ヽ(゚∀゚)メ(゚∀゚)ノ 我们可以直接二分一个答案,然后检验 是否存在一个值大于等于这个二分的答案的,且覆盖次数大于等于 \(k\) 的区 ...

  7. BZOJ4597:[SHOI2016]随机序列——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4597 你的面前有N个数排成一行.分别为A1, A2, … , An.你打算在每相邻的两个 Ai和 ...

  8. 【题解】ZJOI2013蚂蚁寻路

    这题强呀……打了10+30暴力之后苦想1h并不会做……于是去看题解.看题解的时候又莫名各种看错,结果看了好久才懂……记录一下血泪史吧. 这题不难发现走出来的图形就是一个高低高低的城堡型图案,命名为高峰 ...

  9. 2019字节跳动冬令营day7娱乐赛19题题解

    啊没去听讲题,也没发纸质题解,电子版题解也没有 为最后几个unsolve自闭了一段时间才全都A掉 3个队友写的我没看的题通过人数蛮多就不管了 题目地址:https://pan.baidu.com/s/ ...

随机推荐

  1. Redis(三):新数据类型

    配置文件redis.conf详解 bind=127.0.0.1 # 表示只能在本机中访问redis,将该行注释掉,即可接收任何IP地址的访问 protected-mode # 设置为no,表示关闭保护 ...

  2. Win10 pip install augimg 报 OSError: [WinError 126] 找不到指定的模块,解决办法

    第一种Win10下python成功安装augimg的方法: 下载Shapely,地址https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely,选择对应版本 ...

  3. 痞子衡嵌入式:MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下SDK工程在Build配置上与IAR,MDK差异. 恩智浦 SW 团队每个季度都会公布 SDK.Tool ...

  4. MySQL 5.7新特性介绍

    本文是基于MySQL-5.7.7-rc版本,未来可能 还会发生更多变化. 1.即将删除的特性1.1.InnoDB monitoring features,详见:WL#7377(访问地址:http:// ...

  5. 1,Spark参数调优

    Spark调优 目录 Spark调优 一.代码规范 1.1 避免创建重复RDD 1.2 尽量复用同一个RDD 1.3 多次使用的RDD要持久化 1.4 使用高性能算子 1.5 好习惯 二.参数调优 资 ...

  6. JDK1.8源码(五)——java.util.Vector类

    JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html

  7. springMVC学习总结(三) --springMVC重定向

    根据springMVC学习总结(一) --springMVC搭建搭建项目 在com.myl.controller包下创建一个java类WebController. 在jsp子文件夹下创建一个视图文件i ...

  8. python-request 实现企业微信接口自动化-1(DDT)

    环境准备 python+requests 读取企业微信api开发文档,得知调用企业微信接口必须先获取企业微信的accesstoken是通过 ("corpid","&quo ...

  9. oh,我的老伙计,你看看这近五十个dapr视频

    oh,我的老伙计,你看看这近五十个 dapr 视频.这不就是你想要的视频资料吗?快来捡走吧! 开始了,但是没完全开始 Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的. ...

  10. Maven项目之间关系介绍

    Maven项目之间的关系 依赖关系 单纯的项目A中需要项目B中的资源,将项目B打成Jar包被A依赖,此时项目A直接调用项目B中资源即可. 项目A和项目B此时形成最基本的依赖关系. 继承关系 需要场景: ...