[UOJ UNR#2 黎明前的巧克力]
来自FallDream的博客,未经允许,请勿转载,谢谢。
很奇妙的一道题
首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2,最后输出f[0]即可。
这样我就考虑从FWT之后的数组入手。
首先发现F[0]=1只会让最后的数组全部+1,所以只考虑F[ai]=2的影响。
发现每个项只会是3或者-1,这取决于FWT过程中的取反次数。
所以可以设计一个dp,f[i][x]表示分治到第i层,x是2的方案数,F[i][x]表示....,x是-2的方案数。
这样模拟FWT进行dp即可,最后通过快速幂计算出变换后最终的数组,再逆变换回去就是答案啦。
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #define MN 1048576
- #define mod 998244353
- using namespace std;
- inline int read()
- {
- int x=;char ch=getchar();
- while(ch<''||ch>'') ch=getchar();
- while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
- return x;
- }
- const int Inv2=(mod+)/;
- int s[MN+],S[MN+],n,f[][MN+],F[][MN+],num[MN+],sum;
- inline int pow(int x,int k)
- {
- for(sum=;k;k>>=,x=1LL*x*x%mod)
- if(k&) sum=1LL*sum*x%mod;
- return sum;
- }
- void FWT(int l,int r)
- {
- if(l==r) return;
- int mid=l+r>>;FWT(l,mid);FWT(mid+,r);
- for(int i=;i<=mid-l;++i)
- {
- int x=s[l+i],y=s[mid++i];
- s[l+i]=1LL*(x+y)*Inv2%mod;
- s[mid++i]=1LL*(x-y+mod)*Inv2%mod;
- }
- }
- void Solve(int l,int r,int dep)
- {
- if(l==r){f[dep][l]=num[l];return;}
- int mid=l+r>>;Solve(l,mid,dep+);Solve(mid+,r,dep+);
- for(int i=;i<=mid-l;++i)
- {
- f[dep][l+i]=f[dep+][l+i]+f[dep+][mid++i];
- F[dep][l+i]=F[dep+][l+i]+F[dep+][mid++i];
- f[dep][mid++i]=f[dep+][l+i]+F[dep+][mid++i];
- F[dep][mid++i]=F[dep+][l+i]+f[dep+][mid++i];
- }
- }
- int main()
- {
- n=read();
- for(int i=;i<=n;++i) ++num[read()];
- Solve(,MN-,);
- for(int i=;i<MN;++i)
- {
- s[i]=pow(,f[][i]);
- if(F[][i]&) s[i]=(mod-s[i])%mod;
- }
- FWT(,MN-);
- printf("%d\n",(s[]-+mod)%mod);
- return ;
- }
[UOJ UNR#2 黎明前的巧克力]的更多相关文章
- 【uoj#310】[UNR #2]黎明前的巧克力 FWT
题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...
- [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 ...
- 【UOJ#310】【UNR#2】黎明前的巧克力(FWT)
[UOJ#310][UNR#2]黎明前的巧克力(FWT) 题面 UOJ 题解 把问题转化一下,变成有多少个异或和为\(0\)的集合,然后这个集合任意拆分就是答案,所以对于一个大小为\(s\)的集合,其 ...
- uoj310【UNR #2】黎明前的巧克力(FWT)
uoj310[UNR #2]黎明前的巧克力(FWT) uoj 题解时间 对非零项极少的FWT的优化. 首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j ...
- 「UNR#2」黎明前的巧克力
「UNR#2」黎明前的巧克力 解题思路 考虑一个子集 \(S\) 的异或和如果为 \(0\) 那么贡献为 \(2^{|S|}\) ,不难列出生产函数的式子,这里的卷积是异或卷积. \[ [x^0]\p ...
- 【UNR #2】黎明前的巧克力 解题报告
[UNR #2]黎明前的巧克力 首先可以发现,等价于求 xor 和为 \(0\) 的集合个数,每个集合的划分方案数为 \(2^{|S|}\) ,其中 \(|S|\) 为集合的大小 然后可以得到一个朴素 ...
- UOJ #310 黎明前的巧克力 FWT dp
LINK:黎明前的巧克力 我发现 很多难的FWT的题 都和方程有关. 上次那个西行寺无余涅槃 也是各种解方程...(不过这个题至今还未理解. 考虑dp 容易想到f[i][j][k]表示 第一个人得到巧 ...
- @uoj - 310@ 【UNR #2】黎明前的巧克力
目录 @description@ @solution@ @accepted code@ @details@ @description@ Evan 和 Lyra 都是聪明可爱的孩子,两年前,Evan 开 ...
随机推荐
- SCOI2010 序列操作
2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川 题目描述 Description lxhgww最近收到了一个01序列,序列里面包含了n个 ...
- JAVA_SE基础——46.引用数据类型变量.值交换[独家深入解析]
需求:定义一个函数交换数组中两个元素的位置. code 1: import java.util.*; class Demo3 { public static void main(String[] ar ...
- JavaScript AJAX实例
原生JS实现AJAX: // method : 请求方式 POST/GET; // url: 如果为GET方式的话url里面要带参数 // obj: 准备好的容器,方便储存拿到的数据 function ...
- Nginx+Tomcat高性能负载均衡集群搭建
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/8745794.html Nginx是一个高性能的HTTP服务器/反向代理服务器及电子邮件(IMAP/POP3) ...
- 20165226 2017-2018-4 《Java程序设计》第6周学习总结
20165226 2017-2018-4 <Java程序设计>第6周学习总结 教材学习内容总结 第八章 常用实用类 string类 并置 两个常量进行并置,得到的仍是常量. public ...
- mqtt paho ssl java端代码
参考链接:http://blog.csdn.net/lingshi210/article/details/52439050 mqtt 的ssl配置可以参阅 http://houjixin.blog.1 ...
- istio入门(01)istio是什么?
- R语言学习 第九篇:plyr包
在数据分析中,整理数据的本质可以归纳为:对数据进行分割(Split),然后应用(Apply)某些处理函数,最后将结果重新组合(Combine)成所需的格式返回,简单描述为:Split - Apply ...
- leetcode算法:Reshape the Matrix
In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...
- 【WebGL入门】画一个旋转的cube
最近搜罗了各种资料,发现WebGL中文网特别好用,很适合新手入门:http://www.hewebgl.com/article/getarticle/50 只需要下载好需要的所有包,然后用notepa ...