P6097-[模板]子集卷积
正题
题目链接:https://www.luogu.com.cn/problem/P6097
题目大意
长度为\(2^n\)的序列\(a,b\)求一个\(c\)满足
\]
解题思路
从炫酷反演魔术过来的,顺便写掉这题
简单的说就是求\(k\)的所有子集和其补集的乘积和。
只有\(i|j=k\)的话就是普通的\(\text{FWT}\)了,但是还有\(i\&j=\varnothing\)这个东西。
一个巧妙的想法是把这个条件转换为\(|i|+|j|=|i\cup j|\),显然两个之间是充要的。
然后可以把\(a_i\)存在\(f_{ct(i),i}\)这个位置,其中\(ct(i)\)表示\(i\)中\(1\)的个数。同理\(b_i\)存在\(g_{ct(i),i}\)这个位置。
然后就有卷积
\]
这个先暴力\(\text{FWT}\)了\(f,g\)然后暴力卷积然后\(\text{IFWT}\)回去就好了。
时间复杂度\(O(n^22^n)\),不能全开\(\text{long long}\)不然会\(\text T\)的
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=21,P=1e9+9;
int n,k,ct[1<<N],f[N][1<<N],g[N][1<<N],h[N][1<<N];
void FWT(int *f,int op){
for(int p=2;p<=n;p<<=1)
for(int k=0,len=p>>1;k<n;k+=p)
for(int i=k;i<k+len;i++)
(f[i+len]+=(f[i]*op+P)%P)%=P;
return;
}
signed main()
{
// printf("%d",sizeof(f)>>20);
scanf("%d",&k);n=(1<<k);
for(int i=0;i<n;i++){
if(i)ct[i]=ct[i-(i&-i)]+1;
scanf("%d",&f[ct[i]][i]);
}
for(int i=0;i<n;i++)
scanf("%d",&g[ct[i]][i]);
for(int i=0;i<=k;i++)
FWT(f[i],1),FWT(g[i],1);
for(int i=0;i<=k;i++)
for(int j=0;j<=i;j++)
for(int x=0;x<n;x++)
(h[i][x]+=1ll*f[j][x]*g[i-j][x]%P)%=P;
for(int i=0;i<=k;i++)FWT(h[i],-1);
for(int i=0;i<n;i++)
printf("%d ",h[ct[i]][i]);
return 0;
}
P6097-[模板]子集卷积的更多相关文章
- luogu P6097 子集卷积 FST FWT
LINK:子集卷积 学了1h多 终于看懂是怎么回事了(题解写的不太清楚 翻了好几篇博客才懂 一个需要用到的性质 二进制位为1个数是i的二进制数s 任意两个没有子集关系.挺显然. 而FST就是利用这个性 ...
- CF914G Sum the Fibonacci FWT、子集卷积
传送门 一道良心的练习FWT和子集卷积的板子-- 具体来说就是先把所有满足\(s_a \& s_b = 0\)的\(s_a \mid s_b\)的值用子集卷积算出来,将所有\(s_a \opl ...
- CF 914G Sum the Fibonacci——子集卷积
题目:http://codeforces.com/contest/914/problem/G 第一个括号可以子集卷积:第三个括号可以用 FWT 异或卷积:这样算出选两个数组成 x 的方案数:三个部分的 ...
- UOJ 348 【WC2018】州区划分——子集卷积
题目:http://uoj.ac/problem/348 参考:https://www.cnblogs.com/NaVi-Awson/p/9242645.html#%E5%AD%90%E9%9B%86 ...
- hdu 6057 Kanade's convolution(子集卷积)
题解: 然后就是接下来如何fwt 也就是如何处理bit(x) - bit(y) = bit(k)这个条件. 其实就是子集卷积. 把bit(x)和bit(y)划分成两个集合,然后就是子集卷积的形式. 这 ...
- CF 914 G Sum the Fibonacci —— 子集卷积,FWT
题目:http://codeforces.com/contest/914/problem/G 其实就是把各种都用子集卷积和FWT卷起来算即可: 注意乘 Fibonacci 数组的位置: 子集卷积时不能 ...
- UOJ #348 州区划分 —— 状压DP+子集卷积
题目:http://uoj.ac/problem/348 一开始可以 3^n 子集DP,枚举一种状态的最后一个集合是什么来转移: 设 \( f[s] \) 表示 \( s \) 集合内的点都划分好了, ...
- 【学习笔记】fwt&&fmt&&子集卷积
前言:yyb神仙的博客 FWT 基本思路:将多项式变成点值表达,点值相乘之后再逆变换回来得到特定形式的卷积: 多项式的次数界都为\(2^n\)的形式,\(A_0\)定义为前一半多项式(下标二进制第一位 ...
- UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积
传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...
- Future Failure CodeForces - 838C (博弈论,子集卷积)
大意: 两人轮流操作一个长$n$, 只含前$k$种小写字母的串, 每次操作删除一个字符或者将整个串重排, 每次操作后得到的串不能和之前出现过的串相同, 求多少种串能使先手必胜. 找下规律发现$n$为奇 ...
随机推荐
- 单链表(Java--尚硅谷)
基础知识 大体结构和C++的链表差不多 补充之前不知道的:链表分两类,带和不带头结点的链表 现在才知道,Java没有像C/C++那样的指针 首先创建一个LinkList类,然后把链表的各个功能添加进去 ...
- 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)
参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...
- springboot与通用mapper的整合
找到springboot工程下的pom.xml文件,导入如下的依赖jar包 <!--配置通用Mapper start--> <dependency> <groupId&g ...
- WPF日积月累之文件监测与DataGrid指定Row的颜色
一.概述 关于DataGrid指定Row的颜色,我们可以使用转换器和DataGridRow的Style来实现.对于文件的检测,我们可以使用FileSystemWatcher来实现. 二.Demo Co ...
- 关于 java编程思想第五版 《On Java 8》
On Java 8中文版 英雄召集令 这是该项目的GITHUB地址:https://github.com/LingCoder/OnJava8 广招天下英雄,为开源奉献!让我们一起来完成这本书的翻译吧! ...
- linux 常用命令(三)——(centos7)MySql 5.7添加用户、删除用户与授权
一.创建用户:以root用户登录到数据库进行用户创建 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 例如: CREATE US ...
- 初步测试VS2017+Win10IoT,基于World Map of Makers
测试World Map of Makers Demo,创建一个简单的internet连接应用程序来查询web API的状态(目测是一个延时时间),并使用该信息切换LED. 官方仓库的Solution是 ...
- 修改anaconda3 jupyter notebook 默认路径
本文参考了: https://blog.csdn.net/u014552678/article/details/62046638 https://blog.csdn.net/qigenhuochai/ ...
- MySQL-LSN
查看lsn: show engine innodb status Log sequence number 2687274848548 Log flushed up to 2687274848 ...
- Django——Ajax发送请求验证用户名是否被注册
场景: 用户注册的时候,输入用户名之后,Ajax发送请求到后端,后端验证该用户名是否已经被注册,然后返回到注册页面提示用户. 1.模型: from django.db import models cl ...