博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[UOJ310] 黎明前的巧克力
阅读量:5236 次
发布时间:2019-06-14

本文共 1528 字,大约阅读时间需要 5 分钟。

Sol

某比赛搬了这题。

首先选择两个不交非空子集且异或和为0的方案数,等价于选择一个异或和为0的集合,并把它分成两部分的方案数。

这显然可以DP来算,设 \(f[i][j]\) 表示前\(i\)个数异或和为\(j\)的方案数,那么转移就是 \(f[i][j]=f[i-1][j]+2\cdot f[i-1][j\;\text{xor}\;a[i]]\)

如果设 \(b_i[0]=1,b_i[a[i]]=2,b_i[j]=0\),那么这个转移就是求\(f\)\(b_i\;\text{xor}\)卷积的过程,可以用FWT优化,但是复杂度似乎更爆炸了。

如果我们可以把每个\(b\) FWT之后的结果都求出来并乘在一起,最后在对应位置乘到\(f\)上,再把\(f\) IFWT回去不就好了嘛!

如果把\(b_i\)数组FWT之后的结果打印出来,会发现所有位置不是\(3\)就是\(-1\),大概是因为这个\(2\)对每一项的贡献要么是\(2\)要么是\(-2\)

我们可以先把\(b_i\)数组整个加起来,对它做一次FWT。

因为FWT的和等于和的FWT。对于FWT之后的第\(i\)\(s\),设这位有\(x\)个数为\(-1\),那么就有\(n-x\)个数为 \(3\),且\(3(n-x)-x=s\),解得 \(x=\large \frac{3n-s}4\) 。那么FWT之后这一项的值就是 \((-1)^x3^{n-x}\)

然后乘到\(f\)上再IFWT回去就行了。

(uoj被卡了我不知道这代码能过否

(mp数组开小了,已经改过来了

Code

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef double db;typedef long long ll;const int N=1048578;const int maxn=1048576;const int mod=998244353;const int inv2=(mod+1)/2;int n,f[N],b[N],po[N];void Mul(int &x,int y){x=1ll*x*y%mod;}int mul(int x,int y){return 1ll*x*y%mod;}void Dec(int &x,int y){x=x-y<0?x+mod-y:x-y;}int dec(int x,int y){return x-y<0?x+mod-y:x-y;}void Inc(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}int inc(int x,int y){return x+y>=mod?x+y-mod:x+y;}int ksm(int a,int b=mod-2,int ans=1){ while(b){ if(b&1) ans=mul(ans,a); a=mul(a,a); b>>=1; } return ans;}void fwt(int *f,int opt){ for(int mid=1;mid
<<=1){ for(int R=mid<<1,j=0;j

转载于:https://www.cnblogs.com/YoungNeal/p/10541629.html

你可能感兴趣的文章
C++初学之 2.递归算法典型案例: 斐波那契(Fibonacci)兔子问题(第三项为前两项的累加问题)...
查看>>
文本换行处理
查看>>
MySQL笔记
查看>>
shell 基础6
查看>>
CSS div文本垂直居中
查看>>
Error:Failed to resolve: :Base:
查看>>
如何使用Xcode分析调试在真机运行的UE4 IOS版游戏
查看>>
错误: ISO C++ 不同意在类内初始化很量静态成员
查看>>
深入分析Java中的I/O类的特征及适用场合
查看>>
[DIP] 数字图像处理 (MATLAB) CH05
查看>>
linux学习:归档,备份及进程相关命令用法整理
查看>>
为什么计算机要采用二进制0和1作为基础语言
查看>>
servlet之request
查看>>
MongoDB —— 第五篇 主从复制
查看>>
Git 操作常用命令汇总
查看>>
hdoj 1272(并查集)
查看>>
struts-spring 整合
查看>>
Training Models
查看>>
判断是否是微信浏览器
查看>>
Leetcode: Peeking Iterator
查看>>