原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html

题目传送门 - UOJ#310

题意

  给定 $n$ 个数 ,请你选出两个不相交的集合(两个集合交换一下也算一种),问有多少种选择方案使得两个集合各自包含的数的异或值 相等。

  不能两个都不选。

  $n,a_i\leq 10^6$

题解

  首先,问题可以转化成:选择两个集合,他们的异或值为 $0$ 。

  我们可以构造幂级数。

  对于 $a_i$ 我们构造: $h_i(x)=x^0+2x^{a_i}$ 。

  表示的意义是不选 $a_i$ 有一种方案,选择 $a_i$ 可以把它随便扔给两个集合,有两种方案。

  于是我们只需要把所有的这些幂级数做一个异或卷积就可以了。这里注意一下我们可以通过把每一个多项式的 FWT 乘起来得到最终式子的 FWT 。

  但是直接 FWT 显然要 TLE 。

  我们考虑观察一下这个东西的特殊性质。

  对于同一个多项式 $f$ ,我们观察到 $f_i$ 只有两个系数不为 $0$ 的:$f_0=1,f_{a_i}=2$

  考虑 FWT 的变换式(注意一下这里的 $f_0$ 和 $f_1$ 的意义略有不同,这里是分别指 $f$ 的左边一半和右边一半):

$$FWT(f)=(FWT(f_0+f_1),FWT(f_0-f_1))$$

  仔细分析可以发现:$f_0$ 对于任意 $FWT(f)_i$ 的贡献都为 $1$ 。而 $f_{a_i}$ 对任意 $FWT(f)_i$ 的贡献只有 $\pm 2$ 两种。

  于是 $FWT(f)_i=-1$ 或 $FWT(f)_i=3$ 。

  得到这个结论可以干什么?我们仍然不能把它暴力乘起来。

  但是我们如果得到了所有式子的 FWT 之和,是不是就可以得到 $-1$ 和 $3$ 的个数了?

  对于 FWT ,我们有 $FWT(f+g)=FWT(f)+FWT(g)$ ,即所有多项式的和的 FWT 等于 所有的多项式的 FWT 之和。

  于是我们可以一次 FWT 得到 对于每一个下标的 ,所有多项式的 FWT 的该下标的值的和。

  于是我们可以对于每一个下标,解出这个下标的 $-1$ 的个数,设为 $x$ ,那么,我们就可以得到我们一开始需要的:乘积 $=(-1)^x3^{n-x}$ 。

  然后再 IFWT 回来。

  由于要除掉都不选的情况,$f_0-1$ 就是答案。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1<<20,mod=998244353;
const int inv2=499122177,inv4=748683265;
int n,m=1<<20,a[N],Pow3[N];
void FWT(int a[],int n,int flag){
for (int d=1;d<n;d<<=1)
for (int i=0;i<n;i+=(d<<1))
for (int j=0;j<d;j++){
int x=a[i+j],y=a[i+j+d];
a[i+j]=(x+y)%mod;
a[i+j+d]=(x-y+mod)%mod;
if (flag==-1){
a[i+j]=1LL*a[i+j]*inv2%mod;
a[i+j+d]=1LL*a[i+j+d]*inv2%mod;
}
}
}
int main(){
scanf("%d",&n);
memset(a,0,sizeof a);
for (int i=1,x;i<=n;i++){
scanf("%d",&x);
a[x]+=2,a[0]++;
}
FWT(a,m,1);
Pow3[0]=1;
for (int i=1;i<m;i++)
Pow3[i]=1LL*Pow3[i-1]*3%mod;
for (int i=0;i<m;i++){
int x=(1LL*(3*n-a[i])*inv4%mod+mod)%mod;
if (x&1)
a[i]=(-Pow3[n-x]+mod)%mod;
else
a[i]=Pow3[n-x];
}
FWT(a,m,-1);
printf("%d",(a[0]+mod-1)%mod);
return 0;
}

  

UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式的更多相关文章

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

    题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...

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

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

  3. UOJ #310 黎明前的巧克力 FWT dp

    LINK:黎明前的巧克力 我发现 很多难的FWT的题 都和方程有关. 上次那个西行寺无余涅槃 也是各种解方程...(不过这个题至今还未理解. 考虑dp 容易想到f[i][j][k]表示 第一个人得到巧 ...

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

    题意 题目链接 Sol 挂一个讲的看起来比较好的链接 然鹅我最后一步还是没看懂qwq.. 坐等SovietPower大佬发博客 #include<bits/stdc++.h> using ...

  5. [UOJ UNR#2 黎明前的巧克力]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 很奇妙的一道题 首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2 ...

  6. UOJ #310 黎明前的巧克力 (FWT)

    题目传送门 题目大意:给你一个序列,定义一个子序列的权值表示子序列中元素的异或和,现在让你选出两个互不相交的子序列,求选出的这两个子序列权值相等的方案数,$n,a_{i}\leq 10^{6}$ 这是 ...

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

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

  8. [UOJ310][UNR #2]黎明前的巧克力

    uoj description 给你\(n\)个数,求从中选出两个交集为空的非空集合异或和相等的方案数模\(998244353\). sol 其实也就是选出一个集合满足异或和为\(0\),然后把它分成 ...

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

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

随机推荐

  1. [PHP]PDO各方法在发生MYSQL断开时的反应

    1.mixed PDO::errorCode ( void ) 如果单独执行此语句,并不能判断此时MYSQL是否已断开,它返回最上一次对MYSQL操作的错误码 2.public array PDO:: ...

  2. js混淆、eval解密

    js中的eval()方法就是一个js语言的执行器,它能把其中的参数按照JavaScript语法进行解析并执行,简单来说就是把原本的js代码变成了eval的参数,变成参数后代码就成了字符串,其中的一些字 ...

  3. (*(volatile unsigned long *)详解

    (*(volatile unsigned long *) 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实 ...

  4. Confluence 6 服务器的许可证信息

    Confluence 6 服务器的许可证信息. https://www.cwiki.us/display/CONFLUENCEWIKI/Managing+your+Confluence+License

  5. vue-列表嵌套

  6. 51nod1158 最大子矩形 单调栈应用

    #include<iostream> #include<cstring> #include<cstdio> using namespace std; ][6],m, ...

  7. 自动把动态的jsp页面(或静态html)生成PDF文档,并且上传至服务器

    置顶2017年11月06日 14:41:04 阅读数:2311 这几天,任务中有一个难点是把一个打印页面自动给生成PDF文档,并且上传至服务器,然而公司框架只有手动上传文档,打印时可以保存为PDF在本 ...

  8. 2017-2018-2 20165206 实验二《Java面向对象程序设计》实验报告

    2017-2018-2 20165206 实验二<Java面向对象程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:韩啸 学号:20165206 指导教 ...

  9. 010-Python-socket编程

    客户端/服务器的架构 物理层:网卡,光缆,双绞线 数据链路层:包含源mac地址和目标的mac地址,通过广播通讯 网络层:跑的IP协议,IP地址可以定义到一个子网:通过ARP协议可以解析为mac地址: ...

  10. vue 踩坑记录

    1.绑定双击事件用 @dblclick 不要用@ondblclick  在vue中@=on 2.Vue中路由跳转踩坑. 比如我的路由如下定义 routes: [ { path: "/&quo ...