UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式
原文链接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 多项式的更多相关文章
- 【uoj#310】[UNR #2]黎明前的巧克力 FWT
题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...
- uoj310【UNR #2】黎明前的巧克力(FWT)
uoj310[UNR #2]黎明前的巧克力(FWT) uoj 题解时间 对非零项极少的FWT的优化. 首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j ...
- UOJ #310 黎明前的巧克力 FWT dp
LINK:黎明前的巧克力 我发现 很多难的FWT的题 都和方程有关. 上次那个西行寺无余涅槃 也是各种解方程...(不过这个题至今还未理解. 考虑dp 容易想到f[i][j][k]表示 第一个人得到巧 ...
- UOJ#310. 【UNR #2】黎明前的巧克力(FWT)
题意 题目链接 Sol 挂一个讲的看起来比较好的链接 然鹅我最后一步还是没看懂qwq.. 坐等SovietPower大佬发博客 #include<bits/stdc++.h> using ...
- [UOJ UNR#2 黎明前的巧克力]
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 很奇妙的一道题 首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2 ...
- UOJ #310 黎明前的巧克力 (FWT)
题目传送门 题目大意:给你一个序列,定义一个子序列的权值表示子序列中元素的异或和,现在让你选出两个互不相交的子序列,求选出的这两个子序列权值相等的方案数,$n,a_{i}\leq 10^{6}$ 这是 ...
- UOJ310. 【UNR #2】黎明前的巧克力 [FWT]
UOJ 思路 显然可以转化一下,变成统计异或起来等于0的集合个数,这样一个集合的贡献是\(2^{|S|}\). 考虑朴素的\(dp_{i,j}\)表示前\(i\)个数凑出了\(j\)的方案数,发现这其 ...
- [UOJ310][UNR #2]黎明前的巧克力
uoj description 给你\(n\)个数,求从中选出两个交集为空的非空集合异或和相等的方案数模\(998244353\). sol 其实也就是选出一个集合满足异或和为\(0\),然后把它分成 ...
- [FWT] UOJ #310. 【UNR #2】黎明前的巧克力
[uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...
随机推荐
- IDEA中Git更新合并代码后,本地修改丢失
IDEA中,使用Git下载了远程服务器的代码,发现自己修改的代码不在了,此时并没有提交,所以在show history中查看不到,慌死了. 因为有冲突的地方,没有办法合并,所以直接使用了远程的代码 无 ...
- jqgrid获取数据条数
function getResult() {//获取结果结合的函数,可以通过此函数获取查询后匹配的所有数据行. var o = jQuery("#jqgrid"); ...
- nginx+ssl 服务器 双向认证
项目后台服务器采用nginx+tomcat 负载均衡架构 不久 访问协议有http升级为https 对服务器认证采用沃通的ssl证书 nginx ssl证书安装 参照沃通官方文档 他们有技术支持沟通 ...
- Confluence 6 WebDAV 禁用严格路径检查
如果你在你的 WebDAV 客户端发现了一些不正常的现象,例如文件夹在 Confluence 中是存在的,但是在你客户端下载的文件中就不存在了.你可以禁用 WebDAV 插件中的严格路径检查选项,这 ...
- Confluence 6 理解你许可证的用户数
基于你的许可证类型,在你 Confluence 可以被注册的用户也许有限制. 在许可证明细页面中,将会告诉当前使用了多少的许可证(你注册的用户数量). 包括仅仅在 Confluence 中可以使用gl ...
- vue 中axios 的基本配置和基本概念
axios的基本概念及安装配置方法 ajax:异步请求,是一种无需再重新加载整个网页的情况下,能够更新部分网页的技术 axios:用于浏览器和node.js的基于promise的HTTP客户端 a ...
- 扇形多级菜单可配置Demo
预览效果 领导是想把这个做成复选框,所以做成了可以多选的... Demo下载:https://github.com/zhangzn3/arc-menu
- 《剑指offer》 大数递增
本题来自<剑指offer> 大数的存储 题目: 针对以下问题:大数的存储.大数的相加.大数的运算. 思路: 当数据较大时候,long long数据已经存储不了,借助数组的方式进行存储. 假 ...
- django----多对多数据添加
class UserInfo(models.Model): """ 用户表:既有班主任也有老师 """ username = models. ...
- Python字典(Dictionary)
Python中字典与类表类似,也是可变序列,不过与列表不同,他是无序的可变序列,保存的内容是以键 - 值对的形式存放的.类似我们的新华字典,他可以把拼音和汉字关联起来,通过音节表可以快速的找到想要的字 ...