UOJ 310 黎明前的巧克力(FWT)
【题目链接】 http://uoj.ac/problem/310
【题目大意】
给出一个数集,A从中选择一些数,B从中选择一些数,不能同时不选
要求两者选择的数异或和为0,问方案数
【题解】
题目等价于选取一个非空且xor为0的集合并将其拆分为两个子集的方案数
用dp表示xor为j的方案数,易得dp方程dp[i][j]=dp[i-1][j]+2*dp[i-1][j^a[i]]
该式等价于dp数组与只有两个元素有值的g[0]=1,g[a[i]]=2的数组做卷积运算
对g数组进行反演可以发现每次卷积的数组只包含3和-1,
那么我们只要知道对一个下标来说,做的n次卷积中有几个3和-1,
就能够直接乘算出答案,根据FWT的和等于和的FWT,我们将多次需要做卷积的数组相加,
一并做FWT,得到他们和的反演值,在每个位置解关于3和-1的二元一次方程组,
再将其替换为正确值,最后FWT求逆之后下标为0的答案减去1就是答案,
减一是因为两个人取数不能同时为空。
【代码】
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int P=998244353;
const int inv2=(P+1)>>1;
const int N=2000000;
void FWT(int*a,int n){
for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){
int x=a[i+j],y=a[i+j+d];
a[i+j]=(x+y)%P,a[i+j+d]=(x-y+P)%P;
}
}
void UFWT(int*a,int n){
for(int d=1;d<n;d<<=1)for(int m=d<<1,i=0;i<n;i+=m)for(int j=0;j<d;j++){
int x=a[i+j],y=a[i+j+d];
a[i+j]=1LL*(x+y)*inv2%P,a[i+j+d]=1LL*(x-y)*inv2%P;
}
}
int n,x,mx,pw[N],a[N];
int main(){
pw[0]=1;
for(int i=1;i<N;i++)pw[i]=3LL*pw[i-1]%P;
while(~scanf("%d",&n)){
memset(a,0,sizeof(a));
for(int i=mx=1;i<=n;i++){
scanf("%d",&x);
a[0]++; a[x]+=2;
mx=max(mx,x);
}
int m=1;
while(m<=mx)m<<=1;
FWT(a,m);
for(int i=0;i<m;i++){
x=(3ll*n+P-a[i])*inv2%P*inv2%P;
a[i]=(x&1)?(P-pw[n-x])%P:pw[n-x];
}
UFWT(a,m);
printf("%d\n",(a[0]+P-1)%P);
}
return 0;
}
UOJ 310 黎明前的巧克力(FWT)的更多相关文章
- UOJ #310 黎明前的巧克力 FWT dp
LINK:黎明前的巧克力 我发现 很多难的FWT的题 都和方程有关. 上次那个西行寺无余涅槃 也是各种解方程...(不过这个题至今还未理解. 考虑dp 容易想到f[i][j][k]表示 第一个人得到巧 ...
- UOJ #310 黎明前的巧克力 (FWT)
题目传送门 题目大意:给你一个序列,定义一个子序列的权值表示子序列中元素的异或和,现在让你选出两个互不相交的子序列,求选出的这两个子序列权值相等的方案数,$n,a_{i}\leq 10^{6}$ 这是 ...
- uoj310【UNR #2】黎明前的巧克力(FWT)
uoj310[UNR #2]黎明前的巧克力(FWT) uoj 题解时间 对非零项极少的FWT的优化. 首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j ...
- UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html 题目传送门 - UOJ#310 题意 给定 $n$ 个数 ,请你选出两个不相交的集合(两个 ...
- 【uoj#310】[UNR #2]黎明前的巧克力 FWT
题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...
- UOJ#310. 【UNR #2】黎明前的巧克力(FWT)
题意 题目链接 Sol 挂一个讲的看起来比较好的链接 然鹅我最后一步还是没看懂qwq.. 坐等SovietPower大佬发博客 #include<bits/stdc++.h> using ...
- UOJ310. 【UNR #2】黎明前的巧克力 [FWT]
UOJ 思路 显然可以转化一下,变成统计异或起来等于0的集合个数,这样一个集合的贡献是\(2^{|S|}\). 考虑朴素的\(dp_{i,j}\)表示前\(i\)个数凑出了\(j\)的方案数,发现这其 ...
- [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\)的集合,其 ...
随机推荐
- MongoDB以Windows Service运行
以Administrator身份打开CMD并输入以下命令 cd D:\Developer\MongoDB\mongodb-win32-x86_64-2.4.6\binD:mongod --logpat ...
- MySQL5.7之多源复制&Nginx中间件(上)【转】
有生之年系列----MySQL5.7之多源复制&Nginx中间件(上)-wangwenan6-ITPUB博客http://blog.itpub.net/29510932/viewspace-1 ...
- html-示例代码
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/html" xml ...
- MYSQL-重做系统恢复MYSQL过程
记笔记是好习惯,记笔记是好习惯,记笔记是好习惯! 重要的事情说三遍. 说多了都是泪.第一次装MYSQL时候就遇到了很多问题,当时解决了忘记记录了.家里硬盘满了,于是买了个4T的硬盘重装系统.重装系统后 ...
- find命令的使用
在以.conf结尾的文件里面查找含有aaa字符串的那一行 ( -name后面可以写 "*.*" 即匹配所有的文件 ) find / -name "*.conf& ...
- (一)问候 HttpClient
第一节: HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并 ...
- 涨姿势系列之——内核环境下花式获得CSRSS进程id
这个是翻别人的代码时看到的,所以叫涨姿势系列.作者写了一个获取CSRSS进程PID的函数,结果我看了好久才看懂是这么一个作用.先放上代码 HANDLE GetCsrPid() { HANDLE Pro ...
- mysql索引(btree索引和hash索引的区别)
所有MySQL列类型可以被索引.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节.大多数存储引擎有更高的限制. 索引的存储类型目前只有 ...
- Ansible实战:部署分布式日志系统
本节内容: 背景 分布式日志系统架构图 创建和使用roles JDK 7 role JDK 8 role Zookeeper role Kafka role Elasticsearch role My ...
- Asp.net Vnext 自定义日志
概述 本文已经同步到<Asp.net Vnext 系列教程 >中] 可以通过自定义日志,把错误消息记录到数据库 实现 在启动文件Startup Configure方法中加入自定义的日志提供 ...