来自FallDream的博客,未经允许,请勿转载,谢谢。


传送门

很奇妙的一道题

首先不难发现一个暴力做法,就是f[i]表示异或和为i的答案数,每次FWT上一个F数组,其中F[0]=1,F[ai]=2,最后输出f[0]即可。

这样我就考虑从FWT之后的数组入手。

首先发现F[0]=1只会让最后的数组全部+1,所以只考虑F[ai]=2的影响。

发现每个项只会是3或者-1,这取决于FWT过程中的取反次数。

所以可以设计一个dp,f[i][x]表示分治到第i层,x是2的方案数,F[i][x]表示....,x是-2的方案数。

这样模拟FWT进行dp即可,最后通过快速幂计算出变换后最终的数组,再逆变换回去就是答案啦。

#include<iostream>
#include<cstring>
#include<cstdio>
#define MN 1048576
#define mod 998244353
using namespace std;
inline int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x;
}
const int Inv2=(mod+)/;
int s[MN+],S[MN+],n,f[][MN+],F[][MN+],num[MN+],sum; inline int pow(int x,int k)
{
for(sum=;k;k>>=,x=1LL*x*x%mod)
if(k&) sum=1LL*sum*x%mod;
return sum;
} void FWT(int l,int r)
{
if(l==r) return;
int mid=l+r>>;FWT(l,mid);FWT(mid+,r);
for(int i=;i<=mid-l;++i)
{
int x=s[l+i],y=s[mid++i];
s[l+i]=1LL*(x+y)*Inv2%mod;
s[mid++i]=1LL*(x-y+mod)*Inv2%mod;
}
} void Solve(int l,int r,int dep)
{
if(l==r){f[dep][l]=num[l];return;}
int mid=l+r>>;Solve(l,mid,dep+);Solve(mid+,r,dep+);
for(int i=;i<=mid-l;++i)
{
f[dep][l+i]=f[dep+][l+i]+f[dep+][mid++i];
F[dep][l+i]=F[dep+][l+i]+F[dep+][mid++i];
f[dep][mid++i]=f[dep+][l+i]+F[dep+][mid++i];
F[dep][mid++i]=F[dep+][l+i]+f[dep+][mid++i];
}
} int main()
{
n=read();
for(int i=;i<=n;++i) ++num[read()];
Solve(,MN-,);
for(int i=;i<MN;++i)
{
s[i]=pow(,f[][i]);
if(F[][i]&) s[i]=(mod-s[i])%mod;
}
FWT(,MN-);
printf("%d\n",(s[]-+mod)%mod);
return ;
}

[UOJ UNR#2 黎明前的巧克力]的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 「UNR#2」黎明前的巧克力

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

  7. 【UNR #2】黎明前的巧克力 解题报告

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

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

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

  9. @uoj - 310@ 【UNR #2】黎明前的巧克力

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

随机推荐

  1. NumPy简介

    NumPy是什么? NumPy(Numerrical Python 的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然的使用数组.NumPy包含很多实用的数学函数,涵盖线性代数运 ...

  2. 基于scrapy爬虫的天气数据采集(python)

    基于scrapy爬虫的天气数据采集(python) 一.实验介绍 1.1. 知识点 本节实验中将学习和实践以下知识点: Python基本语法 Scrapy框架 爬虫的概念 二.实验效果 三.项目实战 ...

  3. Python之旅.第三章.函数3.27

    一.形参与实参 1.形参与实参是什么? 形参(形式参数):指的是 在定义函数时,括号内定义的参数,形参其实就变量名 实参(实际参数),指的是 在调用函数时,括号内传入的值,实参其实就变量的值 x,y是 ...

  4. LeetCode & Q167-Two Sum II - Input array is sorted-Easy

    Array Two Pointers Binary Search Description: Given an array of integers that is already sorted in a ...

  5. LR之error(一)

    1 录制时频繁卡死的解决方案 添加数据保护 路径:计算机--高级系统设置(环境变量设置的上级窗口)--高级--设置--数据执行保护 更改LR录制设置,将run-time setting的brower改 ...

  6. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  7. Python内置函数(34)——filter

    英文文档: filter(function, iterable) Construct an iterator from those elements of iterable for which fun ...

  8. 阿里云API网关(18)请求报文和响应报文

    网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...

  9. windows server 2016远程桌面进去,英文系统修改语言

    由于我这边已经是改好了,以下截图来自中文版. 这边选了中文,然后点options. 选择:使该语言成为主要语言,保存. 会提示需要退出登录. 过一会重新登录,ok.

  10. mybatis批量插入

    <insert id="insertBatch" parameterType="java.util.List" > insert into biz_ ...