【UOJ#310】【UNR#2】黎明前的巧克力(FWT)

题面

UOJ

题解

把问题转化一下,变成有多少个异或和为\(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)的更多相关文章

  1. 【uoj#310】[UNR #2]黎明前的巧克力 FWT

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

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

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

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

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

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

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

  5. UOJ#310. 【UNR #2】黎明前的巧克力(FWT)

    题意 题目链接 Sol 挂一个讲的看起来比较好的链接 然鹅我最后一步还是没看懂qwq.. 坐等SovietPower大佬发博客 #include<bits/stdc++.h> using ...

  6. [UOJ UNR#2 黎明前的巧克力]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 很奇妙的一道题 首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2 ...

  7. UOJ #310 黎明前的巧克力 (FWT)

    题目传送门 题目大意:给你一个序列,定义一个子序列的权值表示子序列中元素的异或和,现在让你选出两个互不相交的子序列,求选出的这两个子序列权值相等的方案数,$n,a_{i}\leq 10^{6}$ 这是 ...

  8. UOJ310. 【UNR #2】黎明前的巧克力 [FWT]

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

  9. [UOJ310][UNR #2]黎明前的巧克力

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

  10. [FWT] UOJ #310. 【UNR #2】黎明前的巧克力

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

随机推荐

  1. spanish-1.1

    1.1. ¿Cómo te llamas?Ana : ¿Cómo te llamas?Paco: Buenos dias. Yo soy Paco. Y tú, ¿cómo te llemas?Ana ...

  2. Java方法之参数传递机制

    目录 Java方法之参数传递机制 基本数据类型 引用数据类型 综合练习 总结 Java方法之参数传递机制 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做 ...

  3. JAVA CST时间 转换成Date

    Mybatis中处理Oracle时间类型是个比较麻烦的问题,特别是需要用到时间做比较的,可参考以下代码与思路: 格式化CST时间 SimpleDateFormat sdf = new SimpleDa ...

  4. Centos7 下 PHP 添加缺少的组件 sockets 和 openssl

    环境是 centos7 + nginx 1.14 + php 7.2.18,由于新增邮件发送功能,使用的是 socket 通讯的方式,需要开启 php 的 sockes 和 openssl 扩展 安装 ...

  5. MacOS~jenkins里解决docker执行权限问题

    一 全局配置项设置 需要添加全局变量项,例如名称docker,路径/usr/local 添加一个jenkinsfile文件,用于运行docker命令 pipeline { agent any tool ...

  6. Inherit from the Business Class Library Class 继承自Business类(EF)

    In this lesson, you will learn how to implement business classes for your application using the Busi ...

  7. OpenCV:图像的按位运算

    首先导包: import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(imag ...

  8. JS 对象定义

    JS 对象 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... 此外,JavaScript 允许自定义对象. JavaScript 对象 JavaScript 提供多个内建对象 ...

  9. angluarjs实现过滤并替换关键字

    html样式 <body ng-app="myapp" ng-controller="myCtrl"> <input type="t ...

  10. [Linux]线程分离状态的理解

    在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反, ...