【UOJ#310】【UNR#2】黎明前的巧克力(FWT)
【UOJ#310】【UNR#2】黎明前的巧克力(FWT)
题面
题解
把问题转化一下,变成有多少个异或和为\(0\)的集合,然后这个集合任意拆分就是答案,所以对于一个大小为\(s\)的集合,其贡献是\(2^s\)。
于是我们可以弄出若干个\((1+2x^{a_i})\)这样子的多项式,然后异或卷积把它们卷起来就是答案。
根据\(FWT\)异或卷积的理论,如果\(i\)位置有一个\(1\),那么\(FWT\)之后对于\(j\)位置的贡献是\(-1^{pop\_count(i\&j)}\)。
于是\(1\)对于所有位置的贡献都是\(1\),\(2\)对于所有位置的贡献是\(\pm 2\),所以对于每一个多项式,其\(FWT\)后的结果不是\(-1\)就是\(3\)。
但是对于每一个多项式分别\(FWT\)实在是太过浪费,考虑优化这个过程。
因为我们最终要求的只是每个位置上对应的所有值的乘积,每个位置上不是\(-1\)就是\(3\),那么我们假设有\(x\)个\(-1\),\(n-x\)个\(3\)。
然后我们只需要把\(x\)给解出来就行了。
于是对应这两个值我们要找到一个等式,我们把所有的多项式加起来然后\(FWT\),这样子第\(i\)位上的值\(f_i\)就是\(n\)个多项式\(FWT\)之后的和。
于是我们有:\((-1)*x+3*(n-x)=f_i\),很容易就可以把\(x\)解出来。
然后\((-1)^x*3^{n-x}\)就是每个位置\(FWT\)乘起来之后的值。
把这个数组求出来之后再\(IFWT\)一遍就可以得到答案了。
#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 998244353
#define inv2 499122177
#define inv4 748683265
#define MAX 1048576
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,a[MAX],pw[MAX];
void FWT(int *P,int opt,int len)
{
for(int i=1;i<len;i<<=1)
for(int j=0,p=i<<1;j<len;j+=p)
for(int k=0;k<i;++k)
{
int X=P[j+k],Y=P[i+j+k];
P[j+k]=(X+Y)%MOD,P[i+j+k]=(X+MOD-Y)%MOD;
if(opt==-1)P[j+k]=1ll*P[j+k]*inv2%MOD,P[i+j+k]=1ll*P[i+j+k]*inv2%MOD;
}
}
int main()
{
n=read();
pw[0]=1;for(int i=1;i<=n;++i)pw[i]=3ll*pw[i-1]%MOD;
for(int i=1;i<=n;++i)a[0]+=1,a[read()]+=2;
pw[0]=1;
FWT(a,1,1048576);
for(int i=0;i<1048576;++i)
{
int p=1ll*(n+n+n+MOD-a[i])*inv4%MOD;
a[i]=(p&1)?(MOD-pw[n-p])%MOD:pw[n-p];
}
FWT(a,-1,1048576);
int ans=(a[0]+MOD-1)%MOD;
printf("%d\n",ans);
return 0;
}
【UOJ#310】【UNR#2】黎明前的巧克力(FWT)的更多相关文章
- 【uoj#310】[UNR #2]黎明前的巧克力 FWT
题目描述 给出 $n$ 个数,从中选出两个互不相交的集合,使得第一个集合与第二个集合内的数的异或和相等.求总方案数. 输入 第一行一个正整数 $n$ ,表示巧克力的个数.第二行 $n$ 个整数 $a_ ...
- uoj310【UNR #2】黎明前的巧克力(FWT)
uoj310[UNR #2]黎明前的巧克力(FWT) uoj 题解时间 对非零项极少的FWT的优化. 首先有个十分好想的DP: $ f[i][j] $ 表示考虑了前 $ i $ 个且异或和为 $ j ...
- UOJ #310 黎明前的巧克力 FWT dp
LINK:黎明前的巧克力 我发现 很多难的FWT的题 都和方程有关. 上次那个西行寺无余涅槃 也是各种解方程...(不过这个题至今还未理解. 考虑dp 容易想到f[i][j][k]表示 第一个人得到巧 ...
- UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html 题目传送门 - UOJ#310 题意 给定 $n$ 个数 ,请你选出两个不相交的集合(两个 ...
- UOJ#310. 【UNR #2】黎明前的巧克力(FWT)
题意 题目链接 Sol 挂一个讲的看起来比较好的链接 然鹅我最后一步还是没看懂qwq.. 坐等SovietPower大佬发博客 #include<bits/stdc++.h> using ...
- [UOJ UNR#2 黎明前的巧克力]
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 很奇妙的一道题 首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2 ...
- UOJ #310 黎明前的巧克力 (FWT)
题目传送门 题目大意:给你一个序列,定义一个子序列的权值表示子序列中元素的异或和,现在让你选出两个互不相交的子序列,求选出的这两个子序列权值相等的方案数,$n,a_{i}\leq 10^{6}$ 这是 ...
- UOJ310. 【UNR #2】黎明前的巧克力 [FWT]
UOJ 思路 显然可以转化一下,变成统计异或起来等于0的集合个数,这样一个集合的贡献是\(2^{|S|}\). 考虑朴素的\(dp_{i,j}\)表示前\(i\)个数凑出了\(j\)的方案数,发现这其 ...
- [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 ...
随机推荐
- element-ui 中Switch的用法
在element-ui中,如果你想知道Switch是开还是关,使用事件 @change="getchange(value2)" 它会输出true或者false.true代表的是开, ...
- Django生命周期
以下信息是个人理解所得,如要转载,请注明转载处! 生命周期?很多人会问生命周期是什么?Django也有生命周期吗?他就是一个框架呀. 我们先来说一说一个西瓜的生命周期,一个西瓜刚开始只是一个种子,种到 ...
- Web安全测试学习笔记-DVWA-SQL注入-2
接上一篇SQL注入的学习笔记,上一篇我通过报错信息得知后台数据库是MySQL(这个信息非常重要~),然后通过SQL注入拿到了用户表的所有行,其实我们还可以通过MySQL的特性来拿更多的信息. 1. 获 ...
- ETC到底要不要办?有什么好处?
一说到ETC,开车的朋友想必不会陌生.但很多车友却不太愿意办理ETC, 究其原因,主要是一些谣言所致,一传一十传百最后变成了真实的谎言,并且对此深信不疑, 比如下面5个广泛流传的谣言 在来看看 ...
- Unix 开发中的 Make 三连
Unix 开发过程中,经常性的操作是从源码编译安装相应库文件,所以下面三个命令便是家常便饭,俗称三连: ./configure make make install 下面来看看这三步分别做了什么. co ...
- .net core 2.1 基于Jwt的登录认证
1.新建一个.net core2.1 基于 api 的工程,引用Microsoft.AspNetCore.Authentication.JwtBearer 包 2.新建一个Token的实体类,一个Jw ...
- SSM框架之Spring(5)JdbcTemplate及spring事务控制
Spring(5)JdbcTemplate及spring事务控制 ##1.JdbcTmeplate 它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.spring ...
- 对Android 8.0以上版本通知点击无效的一次分析
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/178 对Android 8.0以上版本通知点击无效的一次分 ...
- Web APP自动更新
我们的手机软件每天都要经营,经常需要更新,比如程序的Bug,好的功能,好的洁面... ... 这就需要我们的用户打开web app时候自动更新客户端程序,而不是再去应用程序商店从新下载.今天的笔记就是 ...
- 自己写的一个连数据库的音乐调用模块 MusicRj
#自己定义 class MusicRj: # 创音乐表t_music # sql = '''CREATE TABLE t_music1( # id INT PRIMARY KEY AUTO_INCRE ...