题目描述

给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等。求总方案数。

输入

第一行一个正整数 $n$ ,表示巧克力的个数。
第二行 $n$ 个整数 $a_i$ 表示每个巧克力的美味值。

输出

输出一行一个整数,表示能使得他们心情契合的吃巧克力的方案数对 998244353 取模的结果。

样例输入

6
1 2 3 4 5 6

样例输出

80


题解

FWT

首先如果两个集合的异或相等,那么它们的异或为0。原问题转化为求选出一个异或和为0的集合并分为两个即可的方案数。

那么设 $f[i][j]$ 表示前 $i$ 个数中选出的数的异或和为 $j$ 的方案数。那么就有 $f[i][j]=f[i-1][j]+2·f[i-1][j\ xor\ a[i]]$ 。

可以发现这是一个异或卷积的形式,相当于每次卷的是:$b[0]=1,b[a[i]]=2$ ,然而并无卵用 = =

考虑对这个过程进行FWT,那么:

0对每个位置的贡献都是1;
a[i]对某些位置的贡献是2,对某些位置的贡献是-2。

所以每次卷上的 $b$ 数组的每个数都是-1或3。

另有:和的FWT等于FWT的和。

因此把它们求和后进行FWT,那么就知道了每个位置FWT的和。

由于只有-1和3,因此可以解出-1和3的个数,然后快速幂处理一下即可。

最终再逆FWT回来即可。

时间复杂度 $O(n\log n)$

  1. #include <cstdio>
  2. #define N 1050000
  3. #define mod 998244353
  4. typedef long long ll;
  5. ll a[N] , b[N];
  6. ll pow(ll x , ll y)
  7. {
  8. ll ans = 1;
  9. while(y)
  10. {
  11. if(y & 1) ans = ans * x % mod;
  12. x = x * x % mod , y >>= 1;
  13. }
  14. return ans;
  15. }
  16. void fwt(ll *a , int n , int flag)
  17. {
  18. int i , j , k , t;
  19. for(i = 1 ; i < n ; i <<= 1)
  20. for(j = 0 ; j < n ; j += (i << 1))
  21. for(k = j ; k < j + i ; k ++ )
  22. t = a[k] , a[k] = (t + a[k + i]) * flag % mod , a[k + i] = (t - a[k + i] + mod) * flag % mod;
  23. }
  24. int main()
  25. {
  26. int n , mx = 0 , m = 1 , i , x;
  27. scanf("%d" , &n);
  28. for(i = 1 ; i <= n ; i ++ )
  29. {
  30. scanf("%d" , &x) , a[0] ++ , a[x] += 2;
  31. if(mx < x) mx = x;
  32. }
  33. while(m <= mx) m <<= 1;
  34. fwt(a , m , 1);
  35. for(i = 0 ; i < m ; i ++ )
  36. {
  37. x = (n + a[i]) * 748683265 % mod;
  38. if(((x + n) % mod) & 1) b[i] = (mod - pow(3 , x)) % mod;
  39. else b[i] = pow(3 , x);
  40. }
  41. fwt(b , m , 499122177);
  42. printf("%lld\n" , (b[0] - 1 + mod) % mod);
  43. return 0;
  44. }

【uoj#310】[UNR #2]黎明前的巧克力 FWT的更多相关文章

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

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

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

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

  3. UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html 题目传送门 - UOJ#310 题意 给定 $n$ 个数 ,请你选出两个不相交的集合(两个 ...

  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. mfc通过MapWinGIS控件读取shp文件(不通过#import实现)

    1.首先注册MapWinGIS ActiveX组件, 引入MapWinGIS.ocx产生的MapWinGIS_i.h和MapWinGIS_i.c文件,利用CoCreateInstance函数来调用 演 ...

  2. PostgreSQL参数学习:vacuum_defer_clean_age

    官方文档: http://www.postgresql.org/docs/9.3/static/runtime-config-replication.html 为了防止slave端读取数据时,因为读到 ...

  3. [BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]

    Description 传送门 Solution 感性理解一下,最小矩形一定是由一条边和凸包上的边重合的. 然后它就是模板题了..然而真的好难调,小于大于动不动就打错. Code #include&l ...

  4. CF 1064 D. Labyrinth

    D. Labyrinth http://codeforces.com/contest/1064/problem/D 题意: n*m的矩阵,只能往左走l次,往右走r次,上下走无限制,问能走到多少个点. ...

  5. MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 的解决方法

    解决方法如下:  方法 1.在线修改提高允许的max_connection_errors数量: A. 登录Mysql数据库查看max_connection_errors: mysql>show ...

  6. Spring学习(四)-----Spring Bean引用同xml和不同xml bean的例子

    在Spring,bean可以“访问”对方通过bean配置文件指定相同或不同的引用. 1. Bean在不同的XML文件 如果是在不同XML文件中的bean,可以用一个“ref”标签,“bean”属性引用 ...

  7. 04-容器 What, Why, How

    What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行.开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机 ...

  8. UTF-8编码下'\u7528\u6237'转换为中文汉字'用户'

    UTF-8编码下'\u7528\u6237'转换为中文'用户' 一.前言 有过多次,在开发项目中遇见设置文件编码格式为UTF-8,但是打开该文件出现类似\u7528这样的数据,看也看不懂,也不是平常见 ...

  9. DruidDataSource源码分析

    最近公司要求基于阿里的DruidDataSource来做一个连接池监控 , 正好之前没有看过DruidDataSource的源码 , 便自己看了四个多小时写了一些自己的理解 , 给大家分享一下 , 如 ...

  10. How to Manage Amazon-Fulfilled Orders - Cancel an Amazon-Fulfilled Order

    You may request to cancel customer orders that have a status of "Pending" or "Unshipp ...