[UOJ310] 黎明前的巧克力

时间:2021-12-26 00:36:03

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<set>
#include<map>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
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<maxn;mid<<=1){
for(int R=mid<<1,j=0;j<maxn;j+=R){
for(int k=0;k<mid;k++){
int x=f[j+k],y=f[j+k+mid];
f[j+k]=inc(x,y),f[j+k+mid]=dec(x,y);
if(opt<1) Mul(f[j+k],inv2),Mul(f[j+k+mid],inv2);
}
}
}
} signed main(){
scanf("%d",&n); f[0]=1; fwt(f,1);
po[0]=1; for(int i=1;i<=n;i++) po[i]=mul(po[i-1],3);
for(int x,i=1;i<=n;i++)
scanf("%d",&x),b[0]++,b[x]+=2;
fwt(b,1); int ni=ksm(4);
for(int i=0;i<maxn;i++){
int x=mul(dec(n*3,b[i]),ni);
Mul(f[i],x&1?mod-po[n-x]:po[n-x]);
} fwt(f,-1); printf("%d\n",dec(f[0],1));
}

[UOJ310] 黎明前的巧克力的更多相关文章

  1. &lbrack;FWT&rsqb; UOJ &num;310&period; 【UNR &num;2】黎明前的巧克力

    [uoj#310][UNR #2]黎明前的巧克力 FWT - GXZlegend - 博客园 f[i][xor],考虑优化暴力,暴力就是FWT xor一个多项式 整体处理 (以下FWT代表第一步) F ...

  2. 【UOJ&num;310】【UNR&num;2】黎明前的巧克力(FWT)

    [UOJ#310][UNR#2]黎明前的巧克力(FWT) 题面 UOJ 题解 把问题转化一下,变成有多少个异或和为\(0\)的集合,然后这个集合任意拆分就是答案,所以对于一个大小为\(s\)的集合,其 ...

  3. 「UNR&num;2」黎明前的巧克力

    「UNR#2」黎明前的巧克力 解题思路 考虑一个子集 \(S\) 的异或和如果为 \(0\) 那么贡献为 \(2^{|S|}\) ,不难列出生产函数的式子,这里的卷积是异或卷积. \[ [x^0]\p ...

  4. 【UNR &num;2】黎明前的巧克力 解题报告

    [UNR #2]黎明前的巧克力 首先可以发现,等价于求 xor 和为 \(0\) 的集合个数,每个集合的划分方案数为 \(2^{|S|}\) ,其中 \(|S|\) 为集合的大小 然后可以得到一个朴素 ...

  5. UOJ &num;310 黎明前的巧克力 FWT dp

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

  6. UOJ310&period; 【UNR &num;2】黎明前的巧克力 &lbrack;FWT&rsqb;

    UOJ 思路 显然可以转化一下,变成统计异或起来等于0的集合个数,这样一个集合的贡献是\(2^{|S|}\). 考虑朴素的\(dp_{i,j}\)表示前\(i\)个数凑出了\(j\)的方案数,发现这其 ...

  7. &lbrack;UOJ310&rsqb;&lbrack;UNR &num;2&rsqb;黎明前的巧克力

    uoj description 给你\(n\)个数,求从中选出两个交集为空的非空集合异或和相等的方案数模\(998244353\). sol 其实也就是选出一个集合满足异或和为\(0\),然后把它分成 ...

  8. 【uoj&num;310】&lbrack;UNR &num;2&rsqb;黎明前的巧克力 FWT

    题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...

  9. &commat;uoj - 310&commat; 【UNR &num;2】黎明前的巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Evan 和 Lyra 都是聪明可爱的孩子,两年前,Evan 开 ...

随机推荐

  1. bootstrap-fileinput 简单使用

    bootstrap-fileinput 是一款图片/文件上传 bootstrap 插件,简单示例代码: <!DOCTYPE html> <html> <head> ...

  2. Entity Framework Model First下改变数据库脚本的生成方式

    在Entity Framework Model First下, 一个非常常见的需求是改变数据库脚本的生成方式.这个应用场景是指,当用户在Designer上单击鼠标右键,然后选择Generate Dat ...

  3. C&num; HttpWebRequest类

    HttpWebRequest类与HttpRequest类的区别. HttpRequest类的对象用于服务器端,获取客户端传来的请求的信息,包括HTTP报文传送过来的所有信息.而HttpWebReque ...

  4. 转:40多个关于人脸检测&sol;识别的API、库和软件

    文章来自于:http://blog.jobbole.com/45936/ 自从谷歌眼镜被推出以来,围绕人脸识别,出现了很多争议.我们相信,不管是不是通过智能眼镜,人脸识别将在人与人交往甚至人与物交互中 ...

  5. 通俗理解angularjs中的&dollar;apply,&dollar;digest,&dollar;watch

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...

  6. re模块和正则表达式

    re模块 讲正题之前我们先来看一个例子:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/ 这是京东的注册页面,打开页面我们就看 ...

  7. Linux 文件目录解释

    /bin:bin是binary(二进制)的缩写.这个目录是对UNIX系统习惯的沿袭,存放着使用者最经常使用的命令.例如:cp,ls,cat. /boot:这里存放的是启动LINUX时使用的一些核心文件 ...

  8. python中enumerate内置库的使用

    使用enumerate,可以自动进行索引下标的赋值,本例代码中使用enumerate,进行excel单元格的赋值操作. 代码如果重复被调用,可将该代码封装成类进行使用 1 import openpyx ...

  9. 查看cookie的快捷方法

    1.url中输入数字+javascript:alert(document.cookie)   如:2javascript:alert(document.cookie)   ,然后在浏览器中去掉2,回车 ...

  10. SDN 期末作业验收

    前言 SDN 期末作业验收我们是采用的参考场景一,我们在此场景的基础上来做负载均衡,下面是我们搭建的拓扑图 演示视频 https://pan.baidu.com/s/1htkKLPM 负载均衡程序 相 ...