「UNR#2」黎明前的巧克力

解题思路

考虑一个子集 \(S\) 的异或和如果为 \(0\) 那么贡献为 \(2^{|S|}\) ,不难列出生产函数的式子,这里的卷积是异或卷积。

\[[x^0]\prod_{i=1}^{n} (2x^{a_i}+1)
\]

因为每一项只有两项 \(x^0,x^{a_i}\) 有值,记 \(f_i(x) =2x^{a_i}+1\), \(f'_i(x)=\text{Fwt}f(x)\) ,有

\[f_i'(x)=\sum_{S} (1+2\times(-1)^{|S\cap a_i|})x^S
\]

不难发现 \(f'_i(x)\) 的每一项不是 \(3\) 就是 \(-1\) 。

这一步比较巧妙,考虑到 \(\text{Fwt}\) 是一个线性变换,线性变换的和等于和的线性变换,我们对所有多项式求和后 \(\text{Fwt}\) ,可以解方程解出每一项由多少个 \(3\) 和多少个 \(-1\) 构成。

设 \([x^S]f_i(x)\) 由 \(k\) 个 \(-1\) 贡献得到 \(k =\frac{3n-[x^S]f_i(x)}{4}\),然后我们要求所有多项式卷积的 \(\text{Fwt}\) 后的结果,即 \([x^S]=(-1)^k\times3^{n-k}\) ,最后再 \(\text{IFwt}\) 回去即可。

其实最后是不需要 \(\text{IFwt}\) 的,我们只需要求 \([x^0]F(x)\) 的值,根据 \(\text{IFwt}\) 的式子

\[F_S=\dfrac{1}{2^n}\sum_{T}(-1)^{|S\cap T|}F'_T
\]

所以 \([x^0]F(x)\) 的值就是每一项系数加起来除一个 \(2^n\) 。

小结 :遇到点值的时候不要只考虑套路,应当多观察性质。

code

/*program by mangoyang*/
#include <bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef unsigned long long ull;
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int ch = 0, f = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
const int N = 2000005, mod = 998244353;
int a[N], n, res;
inline int Pow(int a, int b){
int ans = 1;
for(; b; b >>= 1, a = 1ll * a * a % mod)
if(b & 1) ans = 1ll * ans * a % mod;
return ans;
}
int main(){
read(n);
int tot = 20, len = 1 << 20;
for(int i = 1, x; i <= n; i++)
read(x), a[x] += 2, a[0]++;
for(int i = 0; i < tot; i++)
for(int s = 0; s < len; s++) if(s & (1 << i)){
int x = a[s], y = a[s^(1<<i)];
a[s^(1<<i)] = x + y >= mod ? x + y - mod : x + y;
a[s] = y - x < 0 ? y - x + mod : y - x;;
}
for(int i = 0; i < len; i++){
int k = ((3ll * n - a[i]) % mod + mod) % mod;
k = 1ll * k * Pow(4, mod - 2) % mod;
if(k & 1) res -= Pow(3, n - k);
else res += Pow(3, n - k);
if(res >= mod) res -= mod;
if(res < 0) res += mod;
}
cout << (1ll * res * Pow(len, mod - 2) % mod + mod - 1) % mod << endl;
return 0;
}

「UNR#2」黎明前的巧克力的更多相关文章

  1. UOJ #310「UNR #2」黎明前的巧克力

    神仙题啊... UOJ #310 题意 将原集合划分成$ A,B,C$三部分,要求满足$ A,B$不全为空且$ A$的异或和等于$ B$的异或和 求方案数 集合大小 $n\leq 10^6$ 值域$v ...

  2. 【UOJ#310】【UNR#2】黎明前的巧克力(FWT)

    [UOJ#310][UNR#2]黎明前的巧克力(FWT) 题面 UOJ 题解 把问题转化一下,变成有多少个异或和为\(0\)的集合,然后这个集合任意拆分就是答案,所以对于一个大小为\(s\)的集合,其 ...

  3. 【UNR #2】黎明前的巧克力 解题报告

    [UNR #2]黎明前的巧克力 首先可以发现,等价于求 xor 和为 \(0\) 的集合个数,每个集合的划分方案数为 \(2^{|S|}\) ,其中 \(|S|\) 为集合的大小 然后可以得到一个朴素 ...

  4. uoj310【UNR #2】黎明前的巧克力(FWT)

    uoj310[UNR #2]黎明前的巧克力(FWT) uoj 题解时间 对非零项极少的FWT的优化. 首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j ...

  5. [FWT] UOJ #310. 【UNR #2】黎明前的巧克力

    [uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...

  6. @uoj - 310@ 【UNR #2】黎明前的巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Evan 和 Lyra 都是聪明可爱的孩子,两年前,Evan 开 ...

  7. UOJ310. 【UNR #2】黎明前的巧克力 [FWT]

    UOJ 思路 显然可以转化一下,变成统计异或起来等于0的集合个数,这样一个集合的贡献是\(2^{|S|}\). 考虑朴素的\(dp_{i,j}\)表示前\(i\)个数凑出了\(j\)的方案数,发现这其 ...

  8. uoj310. 【UNR #2】黎明前的巧克力

    题目描述: uoj 题解: WTF. 看题解看了一个小时才看明白. 首先有状态$f[i][j]$表示前$i$个东西两人取,最后两人异或和为$j$的有多少方案. 转移为$f[i][j]=f[i-1][j ...

  9. UOJ#310.【UNR #2】黎明前的巧克力(FWT)

    题意 给出 \(n\) 个数 \(\{a_1, \cdots, a_n\}\),从中选出两个互不相交的集合(不能都为空),使得第一个集合与第二个集合内的数的异或和相等,求总方案数 \(\bmod 99 ...

随机推荐

  1. 【软件工程第三次作业】结对编程:四则运算( Java 实现)

    1. GitHub 地址 本项目由 莫少政(3117004667).余泽端(3117004679)结对完成. 项目 GitHub 地址:https://github.com/Yuzeduan/Arit ...

  2. HTTP Status 406 – Not Acceptable

    前端调用这个方法报错: HTTP Status 406 – Not Acceptable Type Status Report Description The target resource does ...

  3. javascript之BOM对象(二location对象)

    一.location对象提供和当前加载的文档相关的信息还有一些导航功能.location对象是window对象的属性,同时也是document对象的属性.window.location和documen ...

  4. 让configure和cmake编译时支持调试选项

    在Linux先编译软件基本都是采用configure文件生成makefile,或者,cmake生成makefile文件两种方式.它们生成的makefile文件,一般默认不支持-g调试选项.但我们使用这 ...

  5. [转]【HttpServlet】HttpServletResponse接口 案例:完成文件下载

    创建时间:6.19 & 6.24 1.案例-完成文件下载 1)  什么情况下会文件下载? 浏览器不能解析的文件就下载 *使用a标签直接指向服务器上的资源 2)什么情况下需要在服务端编写文件下载 ...

  6. 最常见Linux操作

    命令 含义 cd /home/hadoop #把/home/hadoop设置为当前目录 cd .. #返回上一级目录 cd ~ #进入到当前Linux系统登录用户的主目录(或主文件夹).在 Linux ...

  7. Vue中swiper手动滑动后不能自动播放的解决方法

    用户操作swiper之后,是否禁止autoplay.默认为true:停止.如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay.操作包括触碰,拖动,点击pa ...

  8. 使用SpringBoot编写Restful风格接口

    一.简介    Restful是一种对url进行规范的编码风格,通常一个网址对应一个资源,访问形式类似http://xxx.com/xx/{id}/{id}. 举个栗子,当我们在某购物网站上买手机时会 ...

  9. vmware-vmx.exe进程应该怎么杀掉

    如何解决VMware-vmx.exe无法彻底删除的问题 遇见的问题就是 虚拟机一直黑屏,强制关机之后,无法再次打开的问题. 显示:无法创建新虚拟机: 无法打开配置文件 以独占方式锁定此配置文件失败.另 ...

  10. PDB files out of the debugger

    我想我不需要强调在调试时拥有有效的PDB文件有多重要.通常,PDB文件是由调试器静默加载的,并且您很高兴在modules窗口中看到解析的所有符号.不幸的是,您还可能遇到调试器找不到匹配符号的情况.其原 ...